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); }
//construct an instance of the class and parse list of zip entries public TinyUnzip(Stream stream, bool needDispose = true) { if (!stream.CanSeek) { throw new Exception("Unzip - stream should be able to perform Seek operation!"); } m_needDispose = needDispose; m_stream = stream; m_eocd = EOCD.ReadEOCD(m_stream); m_stream.Seek(m_eocd.offsetToCentralDir, SeekOrigin.Begin); m_reader = new BinaryReader(m_stream); m_centralDirEntries = new CentralDirectory[m_eocd.centralDirsTotalNum]; m_entries = new List <Entry>(m_eocd.centralDirsTotalNum); for (int i = 0; i < m_centralDirEntries.Length; i++) { m_centralDirEntries[i] = CentralDirectory.Read(m_reader); Entry entry = new Entry(m_centralDirEntries[i].fileName, m_centralDirEntries[i].comment, m_centralDirEntries[i].compressedSize, m_centralDirEntries[i].uncompressedSize, m_centralDirEntries[i].fileLastModificationTime, m_centralDirEntries[i].fileLastModificationDate, m_centralDirEntries[i].crc32); m_entries.Add(entry); } }
public static CentralDirectory Read(BinaryReader reader) { CentralDirectory dir = new CentralDirectory(); dir.signature = reader.ReadUInt32(); if (dir.signature != 0x02014b50) { throw new Exception("Bad central directory signature"); } dir.version = reader.ReadUInt16(); dir.extractVersion = reader.ReadUInt16(); dir.generalFlags = reader.ReadUInt16(); dir.compressionMethod = reader.ReadUInt16(); dir.fileLastModificationTime = reader.ReadUInt16(); dir.fileLastModificationDate = reader.ReadUInt16(); dir.crc32 = reader.ReadUInt32(); dir.compressedSize = reader.ReadUInt32(); dir.uncompressedSize = reader.ReadUInt32(); dir.fileNameLength = reader.ReadUInt16(); dir.extraFieldLength = reader.ReadUInt16(); dir.fileCommentLength = reader.ReadUInt16(); dir.diskNumber = reader.ReadUInt16(); dir.internalFileAttributes = reader.ReadUInt16(); dir.externalFileAttributes = reader.ReadUInt32(); dir.relativeFileHeaderOffset = reader.ReadUInt32(); dir.fileName = ReadAsString(reader, dir.fileNameLength); dir.extraField = reader.ReadBytes(dir.extraFieldLength); dir.comment = ReadAsString(reader, dir.fileCommentLength); return(dir); }
//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); }