delphi - 获取 Zip 文件中文件的解压流
问题描述
背景:我正在处理一些压缩的日志文件(我正在将日志详细信息插入数据库)。日志文件有很多 GB 大小,如果能够在不将它们解压缩到磁盘的情况下处理文件(zip 文件只有几百兆字节),那就太好了。我有这个用于提取的日志文件(使用TStreamReader
)。
我想要做的是为 zip 文件中的一个文件获取某种解压缩流,并使用该流来处理日志文件,而无需将整个文件提取到磁盘。解压码流需要支持大于4GB的文件。
TZipFile
insystem.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;
不完美,但仍然有用
推荐阅读
- javascript - 如何将id传递给for循环中的span元素
- javascript - 在 Angular 中设置 Angular Web 组件的样式
- javascript - 我正在尝试使用 Sinon 存根和模拟来测试我的函数,但我收到了一个错误。请建议我正确的写作技巧
- caching - 您如何清除 Whatsapp 上 URL 的片段元数据/打开图形缓存?
- javascript - PWA 添加到主屏幕
- python - Odoo 13:代码中的 act_window 操作忽略了 search_view
- python - PyQt5,将变量列表传递给另一个类
- javascript - 在 React.js 中如何将数据从子组件传递到父组件
- javascript - React Firebase 删除操作
- dicom - 在覆盖 DICOM 中的像素数据时,应替换除 UID 之外的哪些 DICOM 标签?