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

时间:2009-11-20 17:52:54

标签: macos fsevents readdirectorychangesw kqueue

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

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

  

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

它还说:

  

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

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

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

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

4 个答案:

答案 0 :(得分:8)

编辑:未经验证,但康斯坦丁在下面表示此代码示例已于2012年废弃。

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

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

答案 1 :(得分:6)

我自己没有尝试过,但似乎FSEvents能够提​​供10.7(Lion)的文件级通知。来自the description of FSEventStreamCreateFlags

  

kFSEventStreamCreateFlagFileEvents

     

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

     

在OS X v10.7及更高版本中可用。

答案 2 :(得分:2)

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

答案 3 :(得分:-2)

您可能想要查看man fs_usage,虽然它不是特定于目录并且需要root权限。