public byte[] ReadMap(out int bitmapSizeInBits) { byte[] firstBlockBytes = _disk.ReadAllBytesFromBlock(_freeSpaceMapStartingBlock); var stream = new MemoryStream(firstBlockBytes); var binaryReader = new BinaryReader(stream); int freeSpaceLengthInBits = binaryReader.ReadInt32(); int freeSpaceLengthInBytes = SpaceRequirementsCalculator.GetNumberOfChunksNeededToStoreData( freeSpaceLengthInBits, Constants.NumberOfBitsInByte); ReadOnlyCollection <BucketDistribution> numberOfBytesToReadFromEachBlock = ItemDistributor.Distribute(freeSpaceLengthInBytes, _disk.BlockSizeInBytes - Constants.BlockReferenceSizeInBytes, _disk.BlockSizeInBytes); var freeSpaceMap = new byte[freeSpaceLengthInBytes]; int numberOfCurrentBlock = _freeSpaceMapStartingBlock; int initialArrayPosition = 0; foreach (BucketDistribution distribution in numberOfBytesToReadFromEachBlock) { byte[] newArray = _disk.ReadBytesFromBlock(numberOfCurrentBlock + distribution.BucketIndex, distribution.IndexOfFirstItemTheBucketGot, distribution.NumberOfItemsDistributed); Array.Copy(newArray, 0, freeSpaceMap, initialArrayPosition, distribution.NumberOfItemsDistributed); initialArrayPosition += distribution.NumberOfItemsDistributed; } bitmapSizeInBits = freeSpaceLengthInBits; return(freeSpaceMap); }
public byte[] ReadAll() { byte[] bytesRead = _disk.ReadBytesFromBlock(BlockIndex, 0, this.OccupiedSpaceInBytes); return(bytesRead); }