Пример #1
0
        public void LoadFileHeaders(Context context, BlockHeader block)
        {
            BlockContentsSource blockContentsSource = this.CreateBlockContentsSourceAndSeekToFileHeadersStart(context, block);

            BinaryReader fileHeaderReader = context.Reader.BaseReader;

            try {
                fileHeaderReader = this.GetReaderForPotentiallyEncryptedBlock(context, fileHeaderReader, block);
                fileHeaderReader = this.GetReaderForPotentiallyCompressedBlock(context, fileHeaderReader, block);
                using (var structureReader = new ContainerFileLoaderStructureReader(fileHeaderReader, leaveOpen: fileHeaderReader == context.Reader.BaseReader)) {
                    for (int fileIndex = 0; fileIndex < block.NumFiles; ++fileIndex)
                    {
                        long?errorOffset = block.IsCompressed ? default(long?) : context.Reader.StreamPosition;
                        var  fileHeader  = structureReader.ReadFileHeader();
                        fileHeader = context.FileHeaderTransformer.Transform(fileHeader);
                        this.verifier.VerifyFileHeader(fileHeader, block.IsCompressed, errorOffset);

                        this.AddFileToFileSystem(context, fileHeader, blockContentsSource);
                    }
                }
            } finally {
                if (fileHeaderReader != context.Reader.BaseReader)
                {
                    fileHeaderReader.Dispose();
                }
            }
        }
        public ContainerFileLoaderReader(Stream stream, bool leaveOpen)
        {
            if (stream == null)
            {
                throw new ArgumentNullException("stream");
            }
            if (!stream.CanRead)
            {
                throw new ArgumentException("The stream must support reading.", "stream");
            }
            if (!stream.CanSeek)
            {
                throw new ArgumentException("The stream must support seeking.", "stream");
            }

            var baseReader = new BinaryReader(stream, Encoding.UTF8, leaveOpen);

            this.reader = new ContainerFileLoaderStructureReader(baseReader, false);
        }
 public FileEntities.FileHeader ReadFileHeader()
 {
     // // For some reason the DeflateStream used by ZlibStream will sometimes hit EOF prematurely if we read only
     // // small parts at a time. But apparently we can work around this by reading the full file header first into
     // // a buffer and proceed by reading from the buffer.
     using (var memoryReader = new BinaryReader(new MemoryStream(this.BaseReader.ReadBytes(560)))) {
         using (var memoryStructReader = new ContainerFileLoaderStructureReader(memoryReader, true)) {
             var result = new FileEntities.FileHeader()
             {
                 Path                  = memoryStructReader.ReadUTF16String(520, FileFormatException.EntityType.FileHeader),
                 DataOffset            = memoryStructReader.ReadInt64(FileFormatException.EntityType.FileHeader),
                 CompressedFileSize    = memoryStructReader.ReadInt64(FileFormatException.EntityType.FileHeader),
                 UncompressedFileSize  = memoryStructReader.ReadInt64(FileFormatException.EntityType.FileHeader),
                 ModificationTimestamp = memoryStructReader.ReadInt64(FileFormatException.EntityType.FileHeader),
             };
             memoryStructReader.ReadInt64(FileFormatException.EntityType.FileHeader); // skipped
             return(result);
         }
     }
 }