什么是检查目录树中是否有文件更改的最快方法?

4

目前,我正在检查树中每个文件的修改时间(来自fstat的st_mtime)的异或校验和。我将其与找到的文件数量和文件大小校验和(允许溢出)结合使用以确保安全,但我非常担心在极端病态情况下会导致误报。

我考虑的一个替代选择(安全)是按名称和文件内容的CRC32保留每个文件的清单。然而,这个选项对于许多文件(比如数千个)来说相当慢,或者至少比我想象的要慢。

因此,问题是,有什么提示或技巧可以确定目录树中是否更改了任何文件?我希望避免逐字节比较而不牺牲太多可靠性。

非常感谢您的建议。


程序正在运行中还是自上次运行以来? - tstenner
tstenner:如果我正确理解了你的问题,你想知道自上次运行以来是否需要更新文件信息数据库,并且只使用数据库信息作为参考。 - SilentDirge
如果你想(可能)检测出一组日期戳的变化,那么最好对数据集进行适当的校验和计算,而不仅仅是使用异或运算。如果你担心readdir返回的文件顺序可能会发生变化,即使文件系统没有变化,你可以先对每个目录中的文件进行排序(并在遍历期间对目录进行排序)。例如,假设我删除了两个具有相同时间戳的文件,并创建了另外两个具有不同时间戳的文件,如果它们是临时文件,则完全有可能。你的“文件数量和时间戳的异或值”指标无法检测到这一点。 - Steve Jessop
1个回答

2

1
取决于你想要多么谨慎。大多数系统都允许你设置最后修改日期,因此你无法确定它是否已被重置。 - forsvarir
很棒的想法,比CRC32快得多。通过对文件名进行排序,并将每个排序后的名称与mtime附加到一个连贯的文件流中,我可以使用(希望)快速的memcmp捕获任何更改!forsvarir:我不太担心用户自己修改此值,但是提出了一个好观点。 - SilentDirge
@Aureis:这是一个很好的做法! - J T
链接已失效。 - Tiago Dias

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接