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

时间:2008-10-30 05:45:50

标签: winapi filesystems

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

此类程序的一个示例是Sequoia View,它会生成硬盘的树形图。

6 个答案:

答案 0 :(得分:6)

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

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

这不一定能保证没有发生更改,因为有文件系统实用程序可以更改所有属性,尽管这对于基本扫描来说是一个很好的第一步。

您可能会发现source codefswatch有用。

答案 1 :(得分:4)

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

来自MSDN:

  

使用FileSystemWatcher进行监听   指定目录中的更改。您   可以监视文件和文件的变化   指定的子目录   目录。您可以创建一个组件   在本地计算机上观看文件,   网络驱动器或远程计算机。

     

要查看所有文件中的更改,请进行设置   Filter属性为空字符串   (“”)或使用通配符(“”)。至   观看特定文件,设置过滤器   属性到文件名。对于   例如,要注意变化   文件MyDoc.txt,设置过滤器   属性为“MyDoc.txt”。你也可以   注意某种类型的变化   文件。例如,要注意   更改文本文件,设置过滤器   属性为“* .txt”。

答案 2 :(得分:4)

这里有2个问题要处理。

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

第二个问题是,如果你有一个文件夹或文件夹列表,并且想要检查它/它们的内容是否已经改变 - 通过添加/删除或更改该文件夹中的文件。

在这种情况下,最有效的方法是一次读取文件夹内容的文件名,并进行累积散列。不仅如此,您还希望获取属性(使用类似GetFileAttributesEx的内容),并将其包含在哈希中。 (确保排除文件夹“。”和“..” - 否则结果会产生误导。)

这样做的原因是您希望通过文件大小,日期等来捕获文件中的更改。您可能不希望包含LastAccessed时间。

任何大的散列函数都应该这样做。结果是每个文件夹的一个大数字(哈希)。

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

实际上,这种方法可以(很快)告诉你,你需要更详细地了解这里的内容,以及你如何做到这一点取决于你想要实现的目标。

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

答案 3 :(得分:3)

答案 4 :(得分:1)

FindFirstChangeNotification

答案 5 :(得分:1)

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

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

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