Beispiel #1
0
            internal override void PrepareForRead()
            {
                _batData = new byte[Length];

                long     fileOffset = _dataStart;
                BatEntry entry      = new BatEntry();

                foreach (Range <long, long> range in _blocks)
                {
                    for (long block = range.Offset; block < range.Offset + range.Count; ++block)
                    {
                        long chunk       = block / _chunkRatio;
                        long chunkOffset = block % _chunkRatio;
                        long batIndex    = chunk * (_chunkRatio + 1) + chunkOffset;

                        entry.FileOffsetMB       = fileOffset / Sizes.OneMiB;
                        entry.PayloadBlockStatus = PayloadBlockStatus.FullyPresent;
                        entry.WriteTo(_batData, (int)(batIndex * 8));

                        fileOffset += _blockSize;
                    }
                }
            }
Beispiel #2
0
        public PayloadBlockStatus AllocateSpaceForBlock(int block)
        {
            bool dataModified = false;

            BatEntry blockEntry = new BatEntry(_batData, block * 8);
            if (blockEntry.FileOffsetMB == 0)
            {
                blockEntry.FileOffsetMB = AllocateSpace((int)_fileParameters.BlockSize, false) / Sizes.OneMiB;
                dataModified = true;
            }

            if (blockEntry.PayloadBlockStatus != PayloadBlockStatus.FullyPresent
                && blockEntry.PayloadBlockStatus != PayloadBlockStatus.PartiallyPresent)
            {
                if ((_fileParameters.Flags & FileParametersFlags.HasParent) != 0)
                {
                    if (!HasSectorBitmap)
                    {
                        SectorBitmapPos = AllocateSpace((int)Sizes.OneMiB, true);
                    }

                    blockEntry.PayloadBlockStatus = PayloadBlockStatus.PartiallyPresent;
                }
                else
                {
                    blockEntry.PayloadBlockStatus = PayloadBlockStatus.FullyPresent;
                }

                dataModified = true;
            }

            if (dataModified)
            {
                blockEntry.WriteTo(_batData, block * 8);

                _bat.Position = _chunk * (_blocksPerChunk + 1) * 8;
                _bat.Write(_batData, 0, (_blocksPerChunk + 1) * 8);
            }

            return blockEntry.PayloadBlockStatus;
        }
Beispiel #3
0
            internal override void PrepareForRead()
            {
                _batData = new byte[Length];

                long fileOffset = _dataStart;
                BatEntry entry = new BatEntry();

                foreach(var range in _blocks)
                {
                    for(long block = range.Offset; block < range.Offset + range.Count; ++block)
                    {
                        long chunk = block / _chunkRatio;
                        long chunkOffset = block % _chunkRatio;
                        long batIndex = (chunk * (_chunkRatio + 1)) + chunkOffset;

                        entry.FileOffsetMB = fileOffset / Sizes.OneMiB;
                        entry.PayloadBlockStatus = PayloadBlockStatus.FullyPresent;
                        entry.WriteTo(_batData, (int)(batIndex * 8));

                        fileOffset += _blockSize;
                    }
                }
            }