Beispiel #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);
        }
Beispiel #2
0
        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.");
        }
Beispiel #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);
    }
Beispiel #5
0
 private void _read()
 {
     _header = new LocalFileHeader(m_io, this, m_root);
     _body   = m_io.ReadBytes(Header.LenBodyCompressed);
 }
Beispiel #6
0
 public LocalFileHeaderInfo(LocalFileHeader header)
     : base((FileHeaderBase)header)
 {
 }