示例#1
0
        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);
        }