3

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

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

4

6 回答 6

6

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

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

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

您可能会发现fswatch源代码很有帮助。

于 2008-10-30T06:05:53.783 回答
4

您有 2 个问题需要在这里处理。

第一个是如果您想监视动态更改(在程序运行时进行)。在这种情况下,您需要使用 Windows API ReadDirectoryChangesW。网上有很多关于如何使用它的例子。(注意......有些例子不是很好。这个 API 调用可以并且每次调用都会返回一个以上的事件,您需要仔细阅读接口,了解它的工作原理,并处理返回的所有内容。

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

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

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

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

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

实际上,这种方法会(快速地)告诉您,您需要更详细地查看这里的某些内容,而您如何做到这一点取决于您要实现的目标。

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

于 2009-06-21T03:24:21.593 回答
4

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

来自 MSDN:

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

要监视所有文件中的更改,请将 Filter 属性设置为空字符串 ("") 或使用通配符 (" . ")。要查看特定文件,请将 Filter 属性设置为文件名。例如,要监视文件 MyDoc.txt 中的更改,请将 Filter 属性设置为“MyDoc.txt”。您还可以监视特定类型文件的更改。例如,要监视文本文件中的更改,请将 Filter 属性设置为“*.txt”。

于 2008-10-30T06:11:00.370 回答
3

查看目录更改通知

于 2008-10-30T11:09:40.300 回答
1

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

详细信息在这里:http: //vpalos.com/169/recursive-filedirectory-change-detection/

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

于 2009-11-06T15:35:50.253 回答
1

FindFirstChangeNotification

于 2008-10-30T06:06:55.653 回答