private (DataHeader Header, Data Info) InsertInfo(int DataLen, int Pos) { var TotalLen = DataLen + HeadSize; Data Gap; Data Data; if (PopGapMinLen(TotalLen, out Gap) == false)//// haven't free gap { var StreamLen = (int)Stream.Length; Stream.AddLen(TotalLen); Data = new Data() { From = StreamLen, Len = TotalLen, To = StreamLen + TotalLen - 1 }; } else { Data = new Data() { From = Gap.From, Len = TotalLen, To = Gap.From + TotalLen - 1 }; if (Gap.Len > TotalLen) { Gap.Len = Gap.Len - TotalLen; Gap.From = Gap.From + TotalLen; var NextGap = Gap; if (PopNextGap(ref NextGap)) { Gap.Len += NextGap.Len; Gap.To = NextGap.To; } InsertGap(Gap); } } var Header = new DataHeader(); Header.DataLen = Data.Len; Keys.Insert(Data, Pos); if (Keys.Length == Pos + 1) { Header.NextData = -1; } else { Header.NextData = Keys[Pos + 1].From; } return(Header, Data); }