public Sop.DataBlock ReadBlockFromDisk(Algorithm.Collection.ICollectionOnDisk parent, long address, bool getForRemoval) { if (address >= 0) { var o = ((CollectionOnDisk)parent).Blocks[address]; if (o != null) { getForRemoval = true; if (o.SizeOccupied > 0) { if (o.NextItemAddress >= 0 && o.Next == null) { o.Next = ReadBlockFromDisk(parent, o.NextItemAddress, getForRemoval); } return(o); } } } if (parent.FileStream.Length > address) { if (parent is LinkedListOnDisk) { ((LinkedListOnDisk)parent).MoveTo(address); } Sop.DataBlock d = CreateBlock(parent.DataBlockSize); d = ReadBlockFromDisk(parent, address, getForRemoval, getForRemoval, d); if (!d.IsEmpty()) { ReadBlock(parent, d, getForRemoval); } _readAheadBuffer.Clear(); return(d); } Sop.DataBlock r = CreateBlock(parent.DataBlockSize); r.DataAddress = address; return(r); }