30

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

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

重要的一点是通知的粒度是在目录级别。它只告诉您目录中的某些内容发生了变化,但不告诉您发生了什么变化。

它还说:

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

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

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

那么如何在 Mac OS X 下做我想做的事呢?或者,换一种方式问:如何ReadDirectoryChangesW()在用户空间中为 Mac OS X 编写等价物(并且这样做非常有效)?

4

4 回答 4

8

编辑:未验证,但康斯坦丁在下面指出此代码示例自 2012 年起已过时。

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

您可能是正确的,尝试注册无限数量的 kqueue 可能是行不通的。

于 2009-11-23T05:05:10.753 回答
7

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

kFSEventStreamCreateFlagFileEvents

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

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

于 2014-05-27T14:23:11.957 回答
2

在 Mac OS X 上满足您需求的最接近的实用程序(据我所知)是fslogger. 请参阅链接以获取描述、dmg 和源代码: OSXBook - fslogger

于 2011-09-02T03:48:47.500 回答
-2

您可能想签出man fs_usage,尽管它不是特定于目录并且需要 root 权限。

于 2010-06-15T06:04:32.717 回答