代码之家  ›  专栏  ›  技术社区  ›  Paul J. Lucas

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

  •  27
  • Paul J. Lucas  · 技术社区  · 15 年前

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

    我将其视为fsevents,但其技术概述部分说明:

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

    它还说:

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

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

    奇怪的是,在窗户下面,我可以用 ReadDirectoryChangesW() 它的功能正是我想要的。

    那么,在Mac OS X下,如何才能满足我的需求呢?或者,问另一种方式:一个人如何去写相当于 readdirectorychangesw()。 对于用户空间中的Mac OS X(这样做非常有效)?

    4 回复  |  直到 10 年前
        1
  •  6
  •   legoscia    10 年前

    我自己也没有尝试过,但似乎fsevents能够提供截止10.7(lion)的文件级通知。从 the description of FSEventStreamCreateFlags 以下内容:

    kFSEventStreamCreateFlagFileEvents

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

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

        2
  •  8
  •   Rob Napier    12 年前

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

    我不相信有一个特定的API可以满足你的需求。苹果为一个类似的问题提供了示例代码 Watcher . 这不是你想要的,而是你在这一点上能做的最好的。您必须拍摄目录的快照,并在发现有更改时重新扫描。当然,如果您可以信任修改时间,那么最好检查修改时间。

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

        3
  •  2
  •   Honcho    13 年前

    在Mac OS X上最符合您需求的实用程序是 fslogger . 有关说明、DMG和源代码,请参见链接: OSXBook - fslogger

        4
  •  -2
  •   JWWalker    14 年前

    你可能想退房 man fs_usage 但它不是特定于目录的,需要根权限。