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


推荐阅读

    改文件linux命令行?

    改文件linux命令行?,地址,系统,工作,信息,数字,文件,命令,设备,密码,权限,lin

    拷贝文件夹linux命令?

    拷贝文件夹linux命令?,系统,地址,服务,信息,密码,情况,单位,项目,命令,文件,l

    打包文件命令linux?

    打包文件命令linux?,系统,时间,工具,名称,命令,文件,目录,格式,表示,详细信

    linux中文件编辑命令?

    linux中文件编辑命令?,系统,工作,工具,信息,地址,发行,命令,第一,检测,基础,l

    linux文件格式的命令?

    linux文件格式的命令?,设备,命令,系统,文件,标准,代码,情况,电脑,平台,数据,l

    linux命令行编译文件?

    linux命令行编译文件?,代码,系统,项目,工具,网上,手机,电脑,地址,官网,文件,L

    linux下文件写入命令?

    linux下文件写入命令?,系统,信息,文件,名字,电脑,软件,目录,命令,内容,指令,l

    linux命令备份文件夹?

    linux命令备份文件夹?,设备,系统,文件,命令,备份,情况,做好,名字,灵活,数据,l

    linux命令deb文件?

    linux命令deb文件?,软件,位置,第一,系统,中心,工具,信息,发行,网站,管理系统

    linux文件夹删除命令?

    linux文件夹删除命令?,系统,命令,不了,档案,名称,通用,文件夹,文件,目录,指

    linux文件类基本命令?

    linux文件类基本命令?,系统,设备,工具,工作,基础,命令,文件,发行,管理,网络,L

    linux建个文件夹命令?

    linux建个文件夹命令?,系统,名字,命令,文件,文件夹,环境,不了,名称,数据,密

    linux命令添加文件?

    linux命令添加文件?,工作,简介,数据,系统,文件,命令,操作,文件名,内容,终端,l

    linux命令移除文件?

    linux命令移除文件?,系统,环境,不了,名称,命令,文件夹,数据,文件,终端,目录,

    linux文件输入命令?

    linux文件输入命令?,工作,系统,地址,信息,工具,位置,命令,设备,发行,首开,lin

    文件备份命令linux?

    文件备份命令linux?,网站,系统,设备,文件,软件,网络,工具,环境,数据,地址,lin

    linux遍历文件命令?

    linux遍历文件命令?,系统,数据,工具,文件,平台,信息,百度,位置,时间,适当,lin

    linux命令查看小文件?

    linux命令查看小文件?,系统,档案,文件夹,标准,软件,单位,文件,命令,大小,内

    linux文件中剪切命令?

    linux文件中剪切命令?,位置,系统,工作,命令,发行,连续,标准,终端,文件,目录,l

    linux存储文件命令?

    linux存储文件命令?,系统,地址,工作,命令,软件,电脑,标准,底部,信息,文件,lin