Macos Mac OS X中的文件级文件系统更改通知

Macos Mac OS X中的文件级文件系统更改通知,macos,fsevents,readdirectorychangesw,kqueue,Macos,Fsevents,Readdirectorychangesw,Kqueue,我希望在(直接或间接)修改给定目录下的任何文件时通知我的代码。所谓“修改”,我的意思是,每当文件的内容被更改、重命名或删除时,我希望我的代码得到通知;或者如果添加了新文件。对于我的应用程序,可以有数千个文件 我将其视为FSEvents,但其技术概述在一定程度上表明: 需要注意的一点是,通知的粒度是在目录级别的。它只告诉您目录中的某些内容已更改,但不告诉您更改了什么 它还说: 文件系统事件API也不是为查找特定文件何时更改而设计的。为此,kqueues机制更合适 但是,为了在给定文件上使用kque

我希望在(直接或间接)修改给定目录下的任何文件时通知我的代码。所谓“修改”,我的意思是,每当文件的内容被更改、重命名或删除时,我希望我的代码得到通知;或者如果添加了新文件。对于我的应用程序,可以有数千个文件

我将其视为FSEvents,但其技术概述在一定程度上表明:

需要注意的一点是,通知的粒度是在目录级别的。它只告诉您目录中的某些内容已更改,但不告诉您更改了什么

它还说:

文件系统事件API也不是为查找特定文件何时更改而设计的。为此,kqueues机制更合适

但是,为了在给定文件上使用kqueue,必须打开该文件以获取文件描述符。管理数千个文件描述符是不切实际的(而且可能会超过允许打开的文件描述符的最大数量)

奇怪的是,在Windows下,我可以使用
ReadDirectoryChangesW()
函数,而它正是我想要的


那么,在MacOSX下,人们如何做我想做的事情呢?或者,有人问另一种方式:如何在用户空间为Mac OS X编写等价的
ReadDirectoryChangesW()
(而且非常有效)?

编辑:未验证,但Konstantin在下面指出,此代码示例在2012年已经过时

我不相信有一个特定的API为您所寻找的。苹果公司提供了一个类似问题的示例代码,名为。这不是你想要的,但这是你目前能做的最好的。您必须拍摄目录的快照,并在发现有更改时重新扫描它。当然,如果您可以信任修改时间,那么修改时间是最好检查的


您可能是对的,尝试注册无限数量的kqueues可能是不可行的。

您可能想查看
man fs_用法
,尽管它不是特定于目录的,需要根权限。

最近的实用程序(据我所知)符合您在Mac OS X上的需要的是
fslogger
。 有关说明、dmg和源代码,请参阅链接:

我自己还没有尝试过,但从10.7(Lion)开始,FSEvents似乎能够提供文件级通知。发件人:

kFSEventStreamCreateFlagFileEvents

请求文件级通知。您的流将接收有关您正在监视的层次结构中的各个文件的事件,而不是仅接收目录级别的通知。小心使用此标志,因为它将生成比没有它时多得多的事件

在OS X v10.7及更高版本中提供


我通常不喜欢Windows编程,更喜欢Mac/Linux编程。看起来很奇怪,在Windows中至少有一件事更容易做。哦,在Windows上有很多事情更容易做。试着用可可粉说肥皂。NSArray很不错,但有时C风格的通用版本会非常受欢迎。Mac甚至没有ASP.NET(我在看你,WebObjects)。我喜欢可可;这是迄今为止我遇到的最好的框架。但是,任何认为Mac上的开发者比Windows上的开发者一切都好的人都没有在这两个平台上都得到很大的发展。对于这样的东西,我们都在等待zfs的圣杯,它可能会使这类东西变得更简单、更快。总有一天。。。(微软也有winfs的梦想……)问题是你把Linux编程和Mac编程捆绑在一起。使用inotifywait在Linux上很容易做到这一点。