【问题标题】:How do you compare the content of two archive files programmatically?您如何以编程方式比较两个存档文件的内容?
【发布时间】:2010-10-07 03:15:45
【问题描述】:

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

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

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

【问题讨论】:

    标签: perl zip lamp


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      我可以全力推荐Beyond Compare。除非你真的得到了过低的报酬,否则这对你(老板)来说是最大的收获。

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

      问候,
      利文

      【讨论】:

      • @Lieven 是否进行存档比较?以及如何将它链接到我的 perl 脚本?谢谢。
      • 它进行存档比较。您可以从命令行驱动 BC。我认为这在 perl 中是可行的(不知道 perl)。问题将是您不同的文件夹结构...
      • @Lieven,是的,我认为不同的文件夹结构是这里的杀手:(
      • @melaos 我相信像 SDX2000 提到的那样扁平化层次结构是最好的方法。
      【解决方案3】:

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

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

      使用外部程序(例如“SFV Checker”)或以编程方式(例如,.net/java 包含执行此操作的库)可以轻松创建校验和。

      【讨论】:

      • @Carra 所以就我而言,假设有三个原始 zip 文件,现在使用我的脚本我有一个大 zip 文件。我如何使用校验和来做到这一点?谢谢
      • @melaos 我认为他的意思是......您需要提取所有组成文件,然后对它们进行校验和,可能基于文件名或没有它们。
      • 在linux上你可以尝试cksummd5sum来生成校验和
      • 但是您也应该能够使用unzip -l 获得校验和(我认为或者可能是其他一些开关)
      • @SDX2K 好吧,如果我必须将它们提取出来,这意味着我需要循环遍历每个目录和每个文件以逐一比较它们?谢谢。
      【解决方案4】:

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

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

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

      3. 比较 A.txt 和 B.txt 应该是完全一样的。

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

      【讨论】:

      • @SDX2K 是的,我也想过这个问题,但在我自己编写之前一直在寻找一些简单的技巧。谢谢:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-15
      • 1970-01-01
      • 1970-01-01
      • 2011-10-22
      • 2021-04-28
      • 1970-01-01
      相关资源
      最近更新 更多