使用 Perl 在 Windows 系统上测试许多 gzip 文件的有效性

Testing the validity of many gzipped files on a Windows system using Perl

我在目录(在 Windows 系统上)中有数千(或更多)gzip 文件,我的一个工具使用这些 gzip 文件。如果遇到损坏的 gzip 文件,它会方便地忽略它们而不是发出警报。

我一直在尝试编写一个 Perl 程序来遍历每个文件并列出损坏的文件。

我正在使用 Compress::Zlib 模块,并尝试读取每个文件的前 1KB,但没有成功,因为一些文件在最后损坏(在手动提取期间验证,警报只在最后提出)并且读取第一个 1KB 没有显示问题。我想知道对这些文件进行 CRC 检查是否有帮助。

问题:

  1. CRC 验证在这种情况下是否有效?如果是,它是如何工作的?真正的 CRC 是否是 gzip header 的一部分,我们要将它与我们拥有的文件中计算出的 CRC 进行比较?我如何在 Perl 中完成此操作?

  2. 还有其他更简单的方法吗?

Archive::Zip FAQ 对此提供了一些很好的指导。

看起来对您来说最好的选择是检查档案中每个成员的 CRC,以及执行此操作的示例程序 -- ziptest.pl -- comes with the Archive::Zip 模块安装。

简而言之,检查gzip文件的唯一方法是解压直到出现错误,或者成功解压到最后。但是,您不需要存储解压缩的结果。

存储在gzip 文件末尾的CRC 是未压缩数据的CRC,而不是压缩数据。要将其用于验证,您必须解压缩所有数据。这就是 gzip -t 所做的,解压缩数据并检查 CRC,但不存储未压缩的数据。

通常会在压缩数据结束之前检测到压缩数据中的损坏。但如果不是,那么 CRC 以及对也存储在末尾的未压缩长度的检查,将很有可能检测到损坏的文件。

只需使用 "gunzip -t" 命令就可以很容易地测试文件是否损坏,gunzip 也可用于 windows,并且应该带有 gzip 包。