Exemple #1
0
        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);
        }
Exemple #2
0
    //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);
        }
    }
Exemple #3
0
        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);
        }
Exemple #4
0
    //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);
    }