检测自上次扫描以来文件系统中的更改



为文件系统编制索引的程序似乎知道哪些部分自上次索引以来发生了更改,并且只重新扫描该部分。如何确定自上次索引以来文件系统/文件的更改位置。不在乎你用什么语言回答,但我想的是c和windows。

Sequoia View就是这样一个程序的例子,它可以生成硬盘的树图。

一个相当简单的方法是在给定目录中获取文件系统报告的文件大小、日期(作为整数值)和文件名,然后计算一个可以与该目录关联的校验和。您仍然需要使用文件系统数据对所有目录执行此计算,但您不必深入(打开文件以检查差异),除非校验和报告了差异。

为了在文件级别跟踪特定的更改,您将根据单个文件属性存储校验和,当然还有自上次扫描以来是否存在文件和子目录。

这并不一定能保证没有发生更改,因为有文件系统实用程序可以更改各种属性,尽管这是基本扫描的第一步。

您可能会发现fswatch的源代码很有用。

如果您使用.Net托管语言进行编码,请尝试FileSystemWatcher类。

来自MSDN:

使用FileSystemWatcher监视指定目录中的更改。你可以监视文件和指定的子目录目录可以创建零部件要查看本地计算机上的文件网络驱动器或远程计算机。

若要监视所有文件中的更改,请设置将Filter属性设置为空字符串(")或使用通配符(".")。To监视特定文件,设置"筛选器"属性设置为文件名。对于例如,观察文件MyDoc.txt,设置筛选器属性转换为"MyDoc.txt"。您也可以注意某一类型的文件例如,要注意更改文本文件,设置"筛选器"属性设置为"*.txt".

这里有两个问题需要处理。

第一个是如果您想观察动态更改(在程序运行时进行)。在这种情况下,您需要使用Windows API ReadDirectoryChangesW。有很多关于如何使用它的在线示例。(注意……有些示例不是很好。这个API调用CAN AND将为每个调用返回多个事件,您需要仔细阅读接口,了解它的工作原理,并处理返回的所有内容。

第二个问题是,如果您有一个文件夹或文件夹列表,并且您想通过添加/删除或更改该文件夹中的文件来检查其内容是否已更改。

在这种情况下,最有效的方法是一次读取一个文件名的文件夹内容,并进行累积哈希。除此之外,您还希望获得属性(使用GetFileAttributesEx之类的方法),并将这些属性也包括在哈希中。(请确保排除文件夹"."one_answers"..",否则结果会产生误导。)

原因是你想通过文件的大小、日期等来捕捉文件中的更改。不过,你可能不想包括LastAccessed时间。

任何大的散列函数都可以。结果是每个文件夹都有一个大数字(散列)。

然后,当您进行另一次传递时,您将重新计算哈希,并与存储的哈希进行比较,以获得该文件夹的最后一个已知状态。如果散列不匹配,那么你需要详细地浏览文件夹。

实际上,这种方法(很快)告诉你,这里有一些事情你需要更详细地研究,你如何做到这一点取决于你试图实现的目标。

这样做的好处是,您不会查看文件夹中每个文件的内容,而是查看一些元数据,这些元数据可以为您提供足够的指示。因此,处理速度要快数千倍。

查看目录更改通知。

FindFirstChangeNotification

在Linux(我想还有任何其他类似Unix的操作系统)下,可以为文件/文件夹生成一个哈希值,以表示其在给定时间的状态。稍后,只需重新生成哈希并将其与旧值进行比较。事实证明,这对我正在进行的一些项目非常有效!

详细信息如下:http://vpalos.com/169/recursive-filedirectory-change-detection/

它基本上对任何更改都很敏感(即使只更改文件的访问时间)。

相关内容

最新更新