如何在 C/C 中收到文件/目录更改的通知,最好使用 POSIX

如何在 C/C 中收到文件/目录更改的通知,最好使用 POSIX

How to be notified of file/directory change in C/C++, ideally using POSIX

主题说明了一切——通常简单且跨平台的方式是智能地进行投票。但是每个操作系统都有一些无需轮询的方式来通知。是否有可能以合理的跨平台方式进行? (我只关心 Windows 和 Linux,但我使用的是 mac,所以我认为 posix 可能会有所帮助?)


Linux 用户可以使用 inotify

inotify is a Linux kernel subsystem
that provides file system event
notification.

Windows 爱好者的一些好东西:

  • MSDN 上的文件更改通知
  • "当文件夹更改时"文章
  • 文件系统更改通知

Qt 库有一个 QFileSystemWatcher 类,它在文件更改时提供跨平台通知。即使您不使用 Qt,因为源代码可用,您也可以将其作为您自己实现的示例来查看。 Qt 对 Windows、Linux 和 Mac 有单独的实现。


Leopard 有文件系统事件 API。


我之前实际上已经构建了这个系统,用于商业 C 代码库——只要你不需要在阳光下所有奇怪的东西,Windows 和 POSIX 系统有很多重叠之处,你可以抽象出来。

POSIX:使用 inotify——它是为这项工作而构建的完整系统
Windows:使用"更改事件"。您必须自己构建更多的粘合剂和报告(您需要的所有 API 都可用,只是没有 inotify 为您提供的一站式购物服务)。

您可以在"通知线程"中检测到的转发事件的常见内容是:
1)基本上任何侵入性操作 boost::filesystem 都支持,(可能)修改权限除外。这是诸如移动、创建、删除、复制文件夹和文件之类的事情。
2)读取和写入文件(尤其是写入)。请注意,如果您使用异步 I/O,通知可能会乱序显示。
3) 当一个新的卷进来时,比如有人连接了一个闪存驱动器。

inotify 尤其为您提供了疯狂的细粒度控制,Windows 则更少。使用 inotify,如果您真的想要,您可以几乎实时地监控文件系统正在执行的所有操作。我知道在没有轮询的情况下,#3 都是可能的,但请注意,让它在任一系统上正常工作都非常棘手。


我不认为 POSIX 本身有这方面的功能。我见过的最接近跨平台的是 FAM,它似乎适用于 Linux、BSD 和 Irix,但将它移植到 Windows 和 MacOS 并不是那么容易。


libevent 或 libev 似乎是你想要的,虽然我没有使用它们。


我相信 OS X 现在有适当的钩子/回调,因为 Spotlight 索引需要它们。

在 linux 上,您会遇到额外的麻烦,即通常使用多个文件系统。如果您只需要有限数量的文件/目录的功能,我会尝试定期主动寻找修改。


推荐阅读