29

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

4

7 回答 7

30

Linux 用户可以使用inotify

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

一些适用于 Windows 研究员的好东西:

于 2008-09-14T11:32:43.070 回答
20

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

于 2008-09-14T12:27:12.457 回答
2

Leopard有文件系统事件 API

于 2008-09-14T17:20:07.150 回答
1

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

于 2008-09-14T10:46:53.087 回答
1

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

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

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

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

于 2013-12-20T08:29:14.873 回答
0

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

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

于 2008-09-14T11:25:16.070 回答
0

libeventlibev似乎是您想要的,尽管我没有使用它们。

于 2009-04-14T18:12:14.997 回答