System.Zip.TZipFile.ExtractZipFile引发某些文件错误。为什么呢?

问题描述 投票:3回答:2

[使用System.Zip.TZipFile提取ZIP文件时:

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

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

流读取错误。

为什么?

再现错误的zip文件,base64编码:

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

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

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

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

7357193E8F27FE1FB5AF2B8B6AF1F24C

delphi zipfile delphi-10-seattle
2个回答
5
投票

参考The structure of a PKZip file by Florian Buchholz

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

通过查看本地文件头,我推断出该文件为ZIP64。压缩和未压缩的大小字段均为0xffffffff。从上面的参考:

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

要使库支持ZIP64,它需要检测这些条件并从其他头文件中读取64位值。 Delphi代码不执行此操作,并尝试读取不存在的0xffffffff字节。

您将需要找到另一种ZIP文件库,该文件库支持ZIP64,以便在这样的ZIP文件上进行操作。另外,如果可以安排创建ZIP文件的任何文件都使用纯ZIP格式,则可以避免该问题。


0
投票

已为此新功能打开了一个请求(需要TZipFile和Zip64支持):

https://quality.embarcadero.com/browse/RSP-14774

© www.soinside.com 2019 - 2024. All rights reserved.