Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 如何以编程方式查找两个目录之间的差异_Windows_Delphi_Delphi 2007 - Fatal编程技术网

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

Windows 如何以编程方式查找两个目录之间的差异,windows,delphi,delphi-2007,Windows,Delphi,Delphi 2007,首先;我不一定要寻找德尔福代码,吐出来的任何方式,你想要的 我一直在四处搜索(特别是在这里),发现一些人在寻找与目录(包括子目录)进行比较的方法,尽管他们使用逐字节的方法。其次,我不是在寻找difftool,我只是在寻找一种方法来查找不匹配的文件,同样重要的是,查找在一个目录中但不在另一个目录中的文件,反之亦然 更具体地说:我有一个目录(备份文件夹),我使用FindFirstChangeNotification不断更新它。虽然第一次我需要复制所有文件,而且我还需要在应用程序启动时对照原始目录检查

首先;我不一定要寻找德尔福代码,吐出来的任何方式,你想要的

我一直在四处搜索(特别是在这里),发现一些人在寻找与目录(包括子目录)进行比较的方法,尽管他们使用逐字节的方法。其次,我不是在寻找difftool,我只是在寻找一种方法来查找不匹配的文件,同样重要的是,查找在一个目录中但不在另一个目录中的文件,反之亦然

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


问题是:这是最快的方式吗?如果是这样的话,你(大致上)是如何完成工作的?

你不一定需要每个文件的CRC,你可以比较每个文件的“上次修改”日期,以达到最正常的目的。快多了。如果需要额外的安全性,还可以比较长度。您可以通过find函数免费获得这两个指标

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

为了提高速度,尽可能使用Win32函数,避免使用任何Delphi find/copy/getfileinfo函数。我不熟悉Delphi框架,但举例来说,C#东西比Win32函数慢得多。

无论您是否“不寻找difftool”,您是否反对使用Cygwin及其shell的“diff”命令?如果您对此持开放态度,那么这非常容易,尤其是使用带有-r“递归”选项的diff

以下内容生成了我的计算机上安装的两个Rails之间的差异,并且不仅显示了有关文件之间差异的信息,而且,特别是通过“仅”的灰色化,在一个目录中查找文件,而不是在另一个目录中查找文件:

$ 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

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

  • 为每个文件生成CRC/校验和
  • 通过internet将每个文件的名称、路径和CRC/校验和发送到另一台计算机
  • 比较
也许最简单的方法是使用“-dryrun”或“-list only”选项。 (或使用使用rsync算法的众多应用程序之一, 或者将rsync算法编译到应用程序中)

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

无需担心最后一点。Delphi的“框架”是包装Windows API的本机代码,并且往往比.NET等效程序快得多。很有趣,甚至更有趣的是,我从未想到过它。比较长度(文件大小)如何增加安全性?假设任何已编辑的文件都将更新其上次修改日期,这难道还不够安全吗?你的第二段让我有点担心,因为我的印象是,只有当实际事件发生时,通知处理才会亮起。最后的书面日期应该足够了,是的。长度是偏执狂(我一直在想一个存档文件是用旧日期提取的,但大小不同)。我的第二段是这样,当你的程序在后台运行时,你不会连续复制文件。假设您正在前台做其他事情,您不希望性能在长时间内明显下降。因此,你可以将文件复制简单地组合在一起,可能是缓存的突发数据,在剩下的时间里不使用cpu。在第一次运行时(当必须复制所有文件时),我启动一个线程递归文件复制。这不应该消耗任何资源。完成后,只复制更新的文件。这真的会有如此巨大的影响吗?只有一种方法可以找到答案,试试看。我只是提供一个替代方案,以防你发现它是显而易见的。
cd some_backup_directory
rsync --dryrun myname@remote_host:latest_version_directory .