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); } } }