【问题标题】:What is the fastest way to check if any files in a directory tree have changed?检查目录树中的任何文件是否已更改的最快方法是什么?
【发布时间】:2011-03-23 22:16:05
【问题描述】:

目前,我正在检查树中每个文件的修改文件时间(来自 fstat 的 st_mtime)的 XOR 校验和。我将它与找到的文件数量和文件大小校验和(允许溢出)结合起来是安全的,但我非常偏执地认为这会在最极端的病理情况下导致误报。

我正在考虑的一个替代(安全)选项是按名称和文件内容的 CRC32 保留每个文件的清单。但是,此选项非常慢,或者至少比我想要的许多文件(比如说数千个文件)要慢。

所以问题是,您可能有哪些技巧或窍门来确定目录树中的任何文件是否已更改?我想避免逐字节比较而不牺牲太多可靠性。

非常感谢您的建议。

【问题讨论】:

  • 程序运行期间还是自上次运行以来?
  • tstenner:如果我自上次运行以来正确理解您的问题。给定一个文件信息数据库,我想知道是否应该在给定的持续时间后仅使用数据库信息作为参考来更新该数据库。
  • 至少,如果您想(可能)发现日期戳集合中的更改,那么请对数据集进行适当的校验和,而不仅仅是 XOR。如果您担心readdir 返回文件的顺序是否会改变,即使文件系统没有改变,您可以先对每个目录中的文件进行排序(并在遍历期间对目录进行排序)。例如,假设我删除了两个具有相同时间戳的文件,并创建了两个具有另一个时间戳的文件,如果它们是临时文件,则完全合理。您的“文件数和时间戳的 XOR”指标没有发现这一点。

标签: c++ file search last-modified


【解决方案1】:

您能否获得文件具有的“最后修改时间”属性(无论平台如何)。

简单地存储历史值并每隔一段时间检查历史值与当前值。

boost::filesystem 有一个很棒的跨平台 API 可以读取这个值。

编辑:具体看: http://www.pdc.kth.se/training/Talks/C++/boost/libs/filesystem/doc/operations.htm#last_write_time

【讨论】:

  • 取决于你想变得多偏执。大多数系统都会让您设置最后修改日期,因此您无法确定它没有被重置。
  • 好主意,比 CRC32 快得多。通过对文件名进行排序并将 mtime 与每个排序后的名称一起附加到一个连贯的文件流中,我可以通过(希望)快速的 memcmp 捕获任何更改! forsvarir:我不太担心用户自己修改这个值,但很好。
  • @Aureis:这是一个很棒的方法!
  • 链接失效了。
猜你喜欢
  • 2021-01-18
  • 1970-01-01
  • 1970-01-01
  • 2020-01-17
  • 2023-03-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多