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

Pau*_*cas 28 macos readdirectorychangesw fsevents kqueue

我希望在修改给定目录下(直接或间接)任何文件时通知我的代码.通过"修改",我的意思是我希望每当文件的内容被更改,重命名或删除时都会通知我的代码; 或者是否添加了新文件.对于我的应用程序,可能有数千个文件.

我看起来像FSEvents,但其技术概述部分地说:

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

它还说:

文件系统事件API也不是为了查找特定文件何时更改而设计的.出于这种目的,kqueues机制更合适.

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

奇怪的是,在Windows下,我可以使用该ReadDirectoryChangesW()功能,它正是我想要的.

那么如何在Mac OS X下做我想做的事情呢?或者,问另一种方式:如何ReadDirectoryChangesW()在用户空间中编写等效的Mac OS X(并且非常有效地执行此操作)?

Rob*_*ier 8

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

我不相信你正在寻找的是一个特定的API.Apple提供了类似问题的示例代码,称为Watcher.它不是你想要的,但它是你现在能做的最好的事情.您必须拍摄目录的快照,并在发现更改后重新扫描目录.如果您可以信任修改时间,修改时间当然是检查的最佳选择.

你可能是正确的,试图注册无限数量的kqueues可能是行不通的.

  • 哦,Windows上有很多东西比较容易.尝试使用Cocoa谈论SOAP.NSArray很不错,但有时会非常欢迎C#风格的通用.Mac甚至没有接近ASP.NET(我在看你,WebObjects).我喜欢可可; 它是迄今为止我见过的最好的框架.但是那些认为Mac上的开发人员比Windows上的开发人员更好的人并没有在这两方面都有很大的发展.对于像这样的东西,我们都在等待zfs的圣杯,这可能使这种东西更容易,更快.有一天......(微软也梦想着winfs ......) (4认同)

leg*_*cia 7

我自己没有尝试过,但似乎FSEvents能够提​​供10.7(Lion)的文件级通知.从FSEventStreamCreateFlags的描述:

kFSEventStreamCreateFlagFileEvents

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

适用于OS X v10.7及更高版本.