我已经在工具metaMake中做到了这一点。这是食谱:
- 如果索引为空,则使用时间戳== dir.lastModified()-1将根目录添加到索引。
- 在索引中找到所有目录
- 将索引中目录的时间戳与文件系统中的时间戳进行比较。由于您具有完整路径(因此不会扫描涉及的树中的所有文件/目录),因此这是一种快速的操作。
- 如果时间戳已更改,则此目录已更改。重新扫描并更新索引。
- 如果在此步骤中遇到目录丢失的情况,请从索引中删除子树
- 如果遇到现有目录,请忽略它(将在步骤2中进行检查)
- 如果遇到新目录,请使用timestamp == dir.lastModified()-1添加该目录。确保在步骤2中考虑到它。
这将使您有效地注意到新文件和已删除文件。由于在步骤2中仅扫描已知路径,因此这将非常有效。文件系统很难枚举目录中的所有条目,但是当您知道确切名称时它们很快。
缺点:您不会注意到文件已更改。因此,如果您编辑文件,则 不会
反映在目录更改中。如果您也需要此信息,则必须对索引中的文件节点重复上述算法。这次,您可以忽略新的/已删除的文件,因为它们已经在目录运行期间进行了更新。
[编辑]
Zach提到时间戳是不够的。我的答复是:根本没有其他方法可以做到这一点。对于目录以及从实现到实现的更改,“大小”的概念是完全未定义的。没有API可以在其中注册“我希望在文件系统中发生任何更改时收到通知”。在您的应用程序处于活动状态时,有一些API可以工作,但是如果它停止或错过了一个事件,那么您将失去同步。
如果文件系统是远程的,情况会变得更糟,因为各种网络问题都可能导致您不同步。因此,尽管我的解决方案可能不是100%完美且不漏水,但除了结构最特殊的情况外,它都适用。这是唯一可以做到这一点的解决方案。
现在有一个单一的应用程序,它希望在进行修改后保留目录的时间戳:病毒或蠕虫。这显然会破坏我的算法,但是,这并不是要防止病毒感染。如果要防止这种情况,则必须采用完全不同的方法。
实现Zach想要的唯一的另一种方法是建立一个新的文件系统,将该信息永久记录在某个地方,将其出售给Microsoft,然后等待几年(大约10或更多),直到每个人都使用它。



