コード例 #1
0
ファイル: DataBlockDriver2.cs プロジェクト: kouweizhong/Sop
 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);
 }