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 解决问题。
使用 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 解决问题。