System.Zip.TZipFile.ExtractZipFile 对某些文件抛出错误。为什么?

System.Zip.TZipFile.ExtractZipFile throws error with certain files. Why?

使用 System.Zip.TZipFile 解压缩 ZIP 文件时:

System.Zip.TZipFile.ExtractZipFile('C:\test.zip', 'R:\_TEST\');

对于特定的 ZIP 文件,我收到此错误消息框:

Stream read error.

为什么?

用于重现错误的 zip 文件,base64 编码:

UEsDBC0ACAAIAHyDiEcAAAAA//////////8WABQATmV1ZXMgVGV4dGRva3VtZW50LnR4dAEAEAAA AAAAAAAAAAIAAAAAAAAAAwBQSwcIAAAAAAIAAAAAAAAAAAAAAAAAAABQSwECLQstAAgACAB8g4hH AAAAAP//////////FgA4AAAAAAABAAAAAAAAAAAATmV1ZXMgVGV4dGRva3VtZW50LnR4dAEAEAAA AAAAAAAAAAIAAAAAAAAACgAgAAAAAAABABgA1LFkAs0x0QHUsWQCzTHRAdSxZALNMdEBUEsFBgAA AAABAAEAfAAAAGIAAAAAAA==

转到http://www.motobit.com/util/base64-decoder-encoder.asp

将此解码到您的本地存储为 test.zip(不要更改字符集)

解码后的二进制文件的MD5必须为:

7357193E8F27FE1FB5AF2B8B6AF1F24C

参考: PKZip文件的结构 通过 Florian Buchholz.

您的 ZIP 文件是使用 ZIP64 格式的扩展变体存储的。 Delphi 邮政编码不支持 ZIP64。

我通过查看本地文件推断该文件是 ZIP64 header。压缩和未压缩的大小字段都是 0xffffffff。来自上面的参考:

  • 压缩后的大小:如果压缩文件是ZIP64格式,则此字段为0xffffffff,长度存储在extra字段
  • 未压缩大小:如果压缩文件是ZIP64格式,则此字段为0xffffffff,长度存储在额外字段中

对于支持 ZIP64 的库,它需要检测这些条件并从额外的 header 中读取 64 位值。 Delphi 代码不会并尝试读取 0xffffffff 不存在的字节。

您将需要找到一个不同的 ZIP 文件库,一个支持 ZIP64 的库,以便对这样的 ZIP 文件进行操作。或者,如果您可以安排创建 ZIP 文件的任何内容都使用纯 ZIP 格式,则可以 side-step 解决问题。