如何以编程方式比较两个存档文件的内容?

时间:2009-02-12 09:12:01

标签: perl zip lamp

我正在做一些测试,以确保我使用脚本文件创建的一个zip文件将生成与我必须手动点击并通过Web界面创建的几个zip文件的内容相同的输出。因此zip将具有不同的文件夹结构。

当然我可以手动提取它们并使用我强大的眼球技术扫描它们甚至更懒,我可以写一个脚本来做到这一点,但在我投入更多时间并被我的老板指责为公司时间抢劫,我问是否有更好的方法可以做到这一点?

顺便说一句,我正在使用perl LAMP堆栈。 感谢。

4 个答案:

答案 0 :(得分:3)

您可以使用perl的Archive::ZIP或Python的zipfile来提取档案中文件的文件名,大小和CRC校验和。创建一个文件,其中包含按文件名排序的结果(忽略路径)。

对于较小的ZIP,请合并脚本的结果(cat list1 list2 list3 | sort)。

现在,您可以使用diff来比较结果。

答案 1 :(得分:1)

我可以全心全意地推荐Beyond Compare。除非你的薪水过低,否则这对你(老板)来说是最大的收获。

[编辑]我似乎已经扫描了不同的文件夹结构,抱歉.Beyond Compare可以比较具有相同文件夹结构的文件夹中的所有文件。它没有(我相信)情报去搜索不同文件夹中的文件中的匹配项。

的问候,
利芬

答案 2 :(得分:1)

从Carra的回答中得到启示......如果A.zip是您的单个大档案,而B.zip是通过网络生成的档案,那么请使用以下算法

  1. 从A.zip中提取所有文件并递归(wrt文件夹)计算文件夹中存在的文件的校验和(使用cksummd5sum等),其中提取内容并在对其进行排序(将其通过sort)传递到文件(比如A.txt)后保存此信息

  2. 对B.zip执行相同操作并生成B.txt

  3. 将A.txt与B.txt进行比较,它们应完全相同。

  4. OR

    使用unzip -l获取(zip)存档的文件/目录列表,然后展平用户生成的zip文件的层次结构,并使用{{{{{{ 1}}。通过扁平化层次结构,我的意思是您可能需要在一个或两个列表上进行某种预先处理,然后才能与diff进行有意义的比较。

答案 3 :(得分:1)

为您的文件创建crc校验和。

如果原始文件和解压缩文件的校验和相同,则可以确保文件相同。甚至适用于非文本数据。

可以使用外部程序(例如“SFV Checker”)或以编程方式(.net / java,例如包括库来创建)来轻松创建校验和。