为Zip文件中的文件获取解压缩流

时间:2018-08-27 03:30:16

标签: delphi zip

背景:我正在处理一些压缩后的日志文件(我正在将日志详细信息插入数据库中)。日志文件的大小为数GB,并且能够在不将文件提取到磁盘的情况下进行处理非常好(zip文件只有几百兆字节)。我的工作是提取日志文件(使用TStreamReader)。

我要做的是为zip文件中的一个文件获取某种解压缩流,并使用该流处理日志文件,而不必将整个文件提取到磁盘。解压缩流需要支持大于4GB的文件。

TZipFile中的

system.zip似乎已对此提供支持,但我无法使其正常工作-可能是因为它仅支持32位文件大小,并且我正在处理文件比这个大。我还安装了abbrevia,但看不到任何允许我执行的操作。

我正在为此项目使用Delphi XE7。请注意,我不想将zip文件提取到流中(这些文件有很多GB,并且不会有足够的物理内存),而是获得实际的解压缩流。

1 个答案:

答案 0 :(得分:0)

我继续使用System.Zip中的标准TZipFile并检查内部文件是否大于4GB-大致

VAR
  zipStream       : TStream;
  LocalHeader     : TZipHeader;
  StreamSize      : Int64;
  FileName        : string;
begin
//...
  Zip := TZipFile.Create;
  Zip.Open (FileName, TZipMode.zmRead);
  Zip.Read ('somefile.xml', zipStream, LocalHeader);
  StreamSize := LocalHeader.UncompressedSize;
  if StreamSize = MAXDWORD then
    ShowMessage ('File is too large, only the first 4GB will be processed'#10'To process entire file you must extract .xml file manually');
//process zipStream...
end;

不完美,但仍然有用