public static LocalFileHeader Read(BinaryReader reader, CentralDirectory dirEntry) { reader.BaseStream.Seek(dirEntry.relativeFileHeaderOffset, SeekOrigin.Begin); LocalFileHeader fileHeader = new LocalFileHeader(); fileHeader.signature = reader.ReadUInt32(); if (fileHeader.signature != 0x04034b50) { throw new Exception("Bad central directory signature"); } fileHeader.extractVersion = reader.ReadUInt16(); fileHeader.generalFlags = reader.ReadUInt16(); fileHeader.compressionMethod = reader.ReadUInt16(); fileHeader.fileLastModificationTime = reader.ReadUInt16(); fileHeader.fileLastModificationDate = reader.ReadUInt16(); fileHeader.crc32 = reader.ReadUInt32(); fileHeader.compressedSize = reader.ReadUInt32(); fileHeader.uncompressedSize = reader.ReadUInt32(); fileHeader.fileNameLength = reader.ReadUInt16(); fileHeader.extraFieldLength = reader.ReadUInt16(); fileHeader.fileName = ReadAsString(reader, fileHeader.fileNameLength); fileHeader.extraField = reader.ReadBytes(fileHeader.extraFieldLength); return(fileHeader); }
private async Task <Tuple <byte[], DateTime> > Download(PartialZipInfo info, string filePath) { CentralDirectoryHeader cd = info.CentralDirectory.FirstOrDefault(c => c.FileName == filePath); DataProp dataProp; if (cd != null) { dataProp = cd.GetFileInfoStruct(); byte[] localFileBuffer = await _httpService.GetRange(dataProp.headerOffset, dataProp.headerOffset + LocalFileHeader.Size - 1); LocalFileHeader localFileHeader = new LocalFileHeader(localFileBuffer); ulong start = dataProp.headerOffset + LocalFileHeader.Size + localFileHeader.FileNameLength + localFileHeader.ExtraFieldLength; byte[] compressedContent = await _httpService.GetRange(start, start + dataProp.compressedSize - 1); var dateTimeModified = ConvertDOSDateTime(dataProp.modifiedDate, dataProp.modifiedTime); switch (localFileHeader.Compression) { case 0: return(Tuple.Create(compressedContent, dateTimeModified)); case 8: return(Tuple.Create(_deflateService.Inflate(compressedContent), dateTimeModified)); default: throw new PartialZipUnsupportedCompressionException("Unknown compression."); } } throw new PartialZipFileNotFoundException($"Could not find file in archive."); }
private async Task <byte[]> Download(PartialZipInfo info, string filePath) { CentralDirectoryHeader cd = info.CentralDirectory.FirstOrDefault(c => c.FileName == filePath); if (cd != null) { (ulong uncompressedSize, ulong compressedSize, ulong headerOffset, uint diskNum) = cd.GetFileInfo(); byte[] localFileBuffer = await this._httpService.GetRange(headerOffset, headerOffset + LocalFileHeader.Size - 1); LocalFileHeader localFileHeader = new LocalFileHeader(localFileBuffer); ulong start = headerOffset + LocalFileHeader.Size + localFileHeader.FileNameLength + localFileHeader.ExtraFieldLength; byte[] compressedContent = await this._httpService.GetRange(start, start + compressedSize - 1); switch (localFileHeader.Compression) { case 0: return(compressedContent); case 8: return(this._deflateService.Inflate(compressedContent)); default: throw new PartialZipUnsupportedCompressionException("Unknown compression."); } } throw new PartialZipFileNotFoundException($"Could not find file {filePath} in archive."); }
//gets stream for reading uncompressed data //only one stream can be used at the same time public Stream GetStream(string fileName) { CentralDirectory dir = m_centralDirEntries.Where(d => d.fileName == fileName).First(); LocalFileHeader fileHeader = LocalFileHeader.Read(m_reader, dir); switch (fileHeader.compressionMethod) { //no compression case 0: return(new ProxyStream(m_stream, dir.compressedSize)); //deflate case 8: var proxy = new ProxyStream(m_stream, dir.compressedSize); return(new DeflateStream(proxy, CompressionMode.Decompress, true)); } throw new NotSupportedException("Compression method not supported. Method id: " + fileHeader.compressionMethod); }
private void _read() { _header = new LocalFileHeader(m_io, this, m_root); _body = m_io.ReadBytes(Header.LenBodyCompressed); }
public LocalFileHeaderInfo(LocalFileHeader header) : base((FileHeaderBase)header) { }