【问题标题】:File-level filesystem change notification in Mac OS XMac OS X 中的文件级文件系统更改通知
【发布时间】:2022-05-06 21:04:01
【问题描述】:

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

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

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

它还说:

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

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

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

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

【问题讨论】:

    标签: macos fsevents readdirectorychangesw kqueue


    【解决方案1】:

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

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

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

    【讨论】:

    • 我一般不喜欢 Windows 编程,更喜欢 Mac/Linux 编程。在 Windows 中显然至少有一件事情更容易做,这似乎很奇怪。
    • 哦,在 Windows 上可以轻松完成很多事情。尝试使用 Cocoa 谈论 SOAP。 NSArray 很好,但有时 C# 风格的泛型会非常受欢迎。 Mac 甚至没有与 ASP.NET 相近的东西(我在看着你,WebObjects)。我爱可可;这是迄今为止我遇到过的最好的框架。但是,如果有人认为 Mac 上的一切对开发人员来说都比 Windows 上的更好,那么他们在这两个平台上的开发并不多。对于这样的事情,我们都在等待 zfs 的圣杯,它可能会使这类事情变得更容易和更快。总有一天……(微软也有它的 winfs 梦想……)
    • 问题是您将 Linux 编程与 Mac 编程捆绑在一起。在 Linux 上使用 inotifywait 很容易做到这一点。
    【解决方案2】:

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

    kFSEventStreamCreateFlagFileEvents

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          猜你喜欢
          • 2010-11-29
          • 1970-01-01
          • 2011-04-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-03
          • 2012-07-05
          相关资源
          最近更新 更多