索引文件系统的程序似乎知道自上次索引以来哪些部分已更改,并且只重新扫描该部分。如何确定自上次索引以来文件系统/文件的更改位置。你不在乎你回答的语言,但我在想c和windows。
此类程序的一个示例是Sequoia View,它会生成硬盘的树形图。
答案 0 :(得分:6)
一种相当简单的方法是将文件系统报告的文件大小,日期(作为整数值)和文件名放在给定目录中,然后计算一个checksum,然后您可以与该目录关联。您仍然需要使用文件系统数据对所有目录执行此计算,但您不必深入(打开文件以检查差异),除非校验和报告了差异。
为了跟踪文件级别的特定更改,您将根据各个文件属性存储校验和,以及自上次扫描以来是否存在文件和子目录。
这不一定能保证没有发生更改,因为有文件系统实用程序可以更改所有属性,尽管这对于基本扫描来说是一个很好的第一步。
您可能会发现source code的fswatch有用。
答案 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/
它基本上对任何更改都很敏感(即使只更改文件的访问时间)。