主题说明了一切 - 通常简单且跨平台的方式是智能地进行投票。但是每个操作系统都有一些无需轮询的方式来通知。是否有可能以合理的跨平台方式进行?(我只关心 Windows 和 Linux,但我使用的是 mac,所以我认为 posix 可能会有所帮助?)
7 回答
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 上,您会遇到额外的麻烦,即常用的文件系统有多种。如果您只需要有限数量的文件/目录的功能,我会尝试定期主动寻找修改。