如何快速检查zip文件是否损坏?

18

有没有什么实用的方法可以快速检查zip文件是否损坏,只基于文件大小?理想情况下,检查zip文件是否损坏的最佳方法是进行CRC校验,但如果有许多大型zip文件,这可能需要很长时间。我希望能够进行快速的文件大小或头部检查。

提前感谢您的帮助。


我目前正在使用C#完成我的任务,但语言并不重要。 - thuantta
5个回答

26
使用zip -T命令检测文件是否损坏。样本损坏的文件如下:
 zip -T filename.zip
        zip warning: missing end signature--probably not a zip file (did you
        zip warning: remember to use binary mode when you transferred it?)
        zip warning: (if you are trying to read a damaged archive try -F)

zip error: Zip file structure invalid (filename.zip)

1
非常方便。还可以用于区分例如doc和docx文件,其中文件扩展名不可靠。 - geotheory

7
本页第4.3.7节指出,从第18个字节开始,压缩大小为4个字节。您可以尝试阅读并将其与文件大小进行比较。

但是,我认为这对于检查zip文件是否损坏几乎没有用处,原因如下:

  1. 有些zip文件包含除zip部分之外的更多字节。例如,自解压存档具有可执行部分,但仍然是有效的zip文件。
  2. 文件可能损坏而不改变其大小。

因此,我建议计算CRC以保证检查损坏的方法。


此外,许多压缩工具在知道文件长度之前就会写入头部,因此这些字节保持为零(可能是为了支持流式传输)。 - SimonJ
1
@SimonJ所说的是正确的,但是从第18个字节开始的压缩大小是zip文件中单个条目的压缩大小。它不是zip文件的压缩大小。 - Cheeso
1
此外,这可能是显而易见的,但值得说明的是:“计算CRC”仅在已知原始CRC的情况下才能用于验证文件。 - Cheeso

6

DotNetZip是一个免费的开源库,用于处理.NET语言中的zip文件,支持CheckZip()方法以完成所需功能。这里有多种可供选择的保证级别。基本级别只检查元数据的一致性。最完整的级别则对zip文件进行完全提取,并将实际压缩数据不受损坏的情况验证到一个位桶(bitbucket)中。


CodePlex已经关闭,这些页面现在是“存档”。 - HackSlash
这可能是相同的代码吗?https://github.com/DinoChiesa/DotNetZip - HackSlash

6
这可能是一个晚回答,但如果您在Windows命令行上安装了7zip,请将其添加到系统PATH中并运行以下命令:7z t file.zip

1
如果它不在你的路径上,请使用 C:\Progra~1\7-Zip\7z.exe - Tom Robinson

1
要确保完整的存档文件没有问题,你需要提取所有数据(因为CRC是基于未压缩的数据计算的),即使这样,你也不能百分之百确定它没有损坏(因为CRC虽好,但并不能保证数据没有被篡改)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接