Esempio n. 1
0
        public override int Read(byte[] buffer, int offset, int count)
        {
            if (_position == _length)
            {
                return(0);
            }

            if (_position > _length)
            {
                throw new IOException("Attempt to read beyond end of stream");
            }

            int chunk = CorrectChunkIndex((int)(_position / Sizes.OneMiB));

            if (_currentChunkIndex != chunk || _currentChunkData == null)
            {
                if (_currentChunkData != null)
                {
                    _currentChunkData.Dispose();
                    _currentChunkData = null;
                }

                if (!_archive.TryOpenFile(string.Format(CultureInfo.InvariantCulture, @"{0}/{1:D8}", _dir, chunk), out _currentChunkData))
                {
                    _currentChunkData = new ZeroStream(Sizes.OneMiB);
                }

                _currentChunkIndex = chunk;
            }

            long chunkOffset = _position % Sizes.OneMiB;
            int  toRead      = Math.Min((int)Math.Min(Sizes.OneMiB - chunkOffset, _length - _position), count);

            _currentChunkData.Position = chunkOffset;

            int numRead = _currentChunkData.Read(buffer, offset, toRead);

            _position += numRead;
            return(numRead);
        }