如何在C / C ++中通知文件/目录更改,理想情况下使用POSIX

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

Linux用户可以使用inotify

inotify是一个Linux内核子系统,提供文件系统事件通知。

Windows研究员的一些好东西:

  • MSDN上的文件更改通知
  • “ 文件夹更改时 ”文章
  • 变更文件系统通知

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

从Leopard开始有文件系统事件API

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

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

POSIX:使用inotify-它是一个完整的系统,专为此工作而构建
Windows:使用“更改事件”。 你必须自己构建更多的胶水和报告(你需要的所有API都可用,而不是一站式购物inotify给你)。

您可以在“通知线程”中检测到的用于转发事件的常见事项是:
1)基本上任何侵入式操作boost :: filesystem支持,修改权限的(可能的)例外。 这就是移动,创建,删除,复制文件夹和文件。
2)读取和写入文件(特别是写入)。 请注意,如果您使用的是异步I / O,则通知会显示无序。
3)当有新卷进入时,例如有人连接闪存驱动器。

inotify尤其会给你一个疯狂的细粒度控制,Windows不那么。 使用inotify,如果你真的想要,你可以近乎实时监控文件系统正在做的所有事情。 我知道#3是可能的,没有轮询,但要注意在任一系统上让它正常工作真的很棘手。

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

在Linux上,你会遇到额外的问题,即常用的文件系统很多。 如果您只需要有限数量的文件/目录的function,我会尝试定期寻找修改。

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