检测目录中的更改

时间:2011-12-15 01:03:19

标签: c# scripting filesystems directory monitor

我需要监视文件夹及其子目录以进行任何文件操作(添加/删除/重命名)。我已经阅读了有关FileSystemWatcher的内容,但我想监视每次运行程序或用户按下“检查更改”按钮之间的更改(FSW似乎更倾向于运行时检测)。我的第一个想法是遍历所有(子)目录并散列每个文件。然后,连接所有哈希(已经排序)和哈希。当我想检查更改时,我重复这个过程并检查哈希值是否相同。

这是一种有效的方法吗? 此外,一旦我检测到更改,如何找到尽快添加,删除或重命名的文件?

作为旁注,我不介意使用脚本来执行此操作,只要这些脚本不需要最终用户安装任何内容并且脚本可以通知我的C#应用​​程序更改。 / p>

2 个答案:

答案 0 :(得分:2)

我们通过将所有找到的文件与其上次修改时间一起存储在数据库中来处理此问题。

在每次传递文件时,我们检查数据库中的每个文件:如果它不存在于DB中,则它是新的,如果它确实存在,但时间戳不同,则它已更改。

还有一个选项可以处理已删除的文件,方法是在传递之前将数据库中的所有文件标记为ToBeDeleteed,如果找到该文件则清除该文件。然后,在流程结束时,我们可以删除所有标记为ToBeDeleted的记录。

答案 1 :(得分:2)

显然,你需要制作目录树的“快照”,并根据需要进行比较。快照的确切内容取决于您的要求。请记住:

  • 您需要存储文件名才能检测“新”和“已删除”文件
  • 文件大小和上次修改时间是文件已更改或未更改的良好且便宜的指示,但不提供保证
  • 如果文件很大,散列文件内容可能会非常昂贵,但这是唯一可以知道它们已经以近乎完美的准确度发生变化的方法(请记住,散列也会发生冲突,所以如果你想要的话数学100%确定性也不够好)。