如何以编程方式找到两个目录之间的差异

时间:2009-12-26 22:12:55

标签: windows delphi delphi-2007

首先关闭;我不一定在寻找Delphi代码,以任何你想要的方式吐出来。

我一直在寻找(特别是在这里)并找到一些关于人们寻找比较目录(包括子目录)的方法,尽管他们使用逐字节方法。第二关,我寻找difftool,我“只是”寻找一种方法来查找不匹配的文件,同样重要的是,在一个目录中但不在另一个目录中的文件反之亦然。

更具体一点:我有一个目录(备份文件夹),我不断使用FindFirstChangeNotification更新。虽然我第一次需要复制所有文件,但我还需要在应用程序启动时检查备份目录(如果在应用程序未运行时发生了某些事情或者FindFirstChangeNotification未捕获文件更改)。为了解决这个问题,我想为备份文件创建CRC列表,然后运行原始目录,为每个文件计算CRC,最后比较两个CRC。然后以某种方式查找位于一个目录而不是另一个目录中的文件(再次;反之亦然)。

以下是问题:这是最快的方法吗?如果是这样,那么(大致)如何完成工作?

3 个答案:

答案 0 :(得分:5)

您不一定需要为每个文件提供CRC,您只需比较每个文件的“上次修改”日期,以达到正常目的。它的速度更快。如果您需要额外的安全性,还可以比较长度。您可以使用查找功能免费获得这两个指标。

在您的更改通知中,您应该将文件添加到队列中并使用计时器对象每隔约30秒或其他时间复制新排队的文件,这样您就不会频繁更新/检查系统。

要获得更高的速度,请尽可能使用Win32函数,避免任何Delphi查找/复制/ getfileinfo函数。我不熟悉Delphi框架,但是例如C#的东西比Win32函数慢得多。

答案 1 :(得分:0)

无论你“不寻找difftool”,你是否反对使用Cygwin的shell的“diff”命令?如果您对此非常容易,特别是使用带有-r“递归”选项的diff。

以下内容会在我的计算机上生成2个Rails安装之间的差异,并且不仅会显示有关文件之间差异的信息,而且还会通过grepping“Only”来查找一个目录中的文件,而不是另一个目录中的文件:

$ diff -r pgnindex pgnonrails | egrep '^Only|diff'
Only in pgnindex/app/controllers: openings_controller.rb
Only in pgnindex/app/helpers: openings_helper.rb
Only in pgnindex/app/views: openings
diff -r pgnindex/config/environment.rb pgnonrails/config/environment.rb
diff -r pgnindex/config/initializers/session_store.rb pgnonrails/config/initializers/session_store.rb
diff -r pgnindex/log/development.log pgnonrails/log/development.log
Only in pgnindex/test/functional: openings_controller_test.rb
Only in pgnindex/test/unit: helpers

答案 2 :(得分:0)

将本地计算机上的一个目录与数千英里外的另一台计算机上的目录进行比较的最快方法与您的建议完全相同:

  • 为每个文件生成CRC /校验和
  • 通过互联网将每个文件的名称,路径和CRC /校验和发送到另一台计算机
  • 比较

也许最简单的方法是使用“--dryrun”或“--list-only”选项use rsync。 (或者使用许多使用rsync算法的应用程序之一, 或者将rsync算法编译到你的应用程序中。)

cd some_backup_directory
rsync --dryrun myname@remote_host:latest_version_directory .

对于速度,默认rsync假定,正如Blindy建议的那样,具有相同名称和相同路径,相同长度和相同修改时间的两个文件是相同的。 为了更加安全,您可以为rsync提供“--checksum”选项,以忽略长度和修改时间,并强制它与文件的实际内容进行比较(校验和)。