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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了获取Zip文件中文件的解压缩流相关的知识,希望对你有一定的参考价值。

背景:我正在处理一些压缩的日志文件(我将日志详细信息插入到数据库中)。日志文件的大小是几千兆字节,能够处理文件而不将它们提取到磁盘(zip文件只有几百兆字节)会很好。我有一个提取日志文件(使用TStreamReader)。

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

TZipFile中的system.zip看起来像是支持这个,但我无法让它工作 - 可能是因为它只支持32位文件大小而且我正在处理比这更大的文件。我也安装了abbrevia,但看不到任何可以让我这样做的东西。

我在这个项目中使用Delphi XE7。请注意,我不想将zip文件提取到流中(文件很多GB,而且物理内存不够),但要获取实际的解压缩流。

答案

我使用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;

不完美,但仍然有用

以上是关于获取Zip文件中文件的解压缩流的主要内容,如果未能解决你的问题,请参考以下文章

Linux针对单多文件的解压缩操作

Java实现对zip和rar文件的解压缩

使用 -jr 标志创建的 zip 在 macOS 上的解压缩方式不同,当双击与运行解压缩时

java解压zip文件至指定文件夹

求解 java 对压缩文件zip 加密 !

java上传图片到数据库,涉及压缩文件zip/rar上传等