如何监视网络映射驱动器上的文件更改?

How to monitor file changes on network mapped drives?

据我所知,网络映射驱动器显示为 /Volumes 文件夹的子文件夹。

从此文件夹获取文件更改更新 (delete/create/update) 的正确方法是什么?

/dev/fsevents 可以吗?

Finder 如何知道更改?

您可以使用 fswatch,我发现通过 homebrew 安装最简单。而且,是的,它确实使用了 FSEvents。然后你就这样做:

fswatch /Volumes/MUSIC

其中 MUSIC 是我网络上基于 Samba 的音乐服务器。

这是它的实际效果...首先我在顶部 window 显示已安装的卷(并且 MUSIC 是基于 Samba 的),然后我在左下角开始 fswatch window,然后我在顶部 window 的文件系统中进行修改,您可以在 Finder 中看到它们发生,还可以在左下方 window 看到 fswatch 跟踪所有事件。

您还可以在检测到事件时使用它与另一个程序交互,如下所示(摘自 fswatch 联机帮助页):

可能最简单的方法是通过管道将 fswatch 传递给另一个程序以响应事件 使用 xargs:

   $ fswatch -0 [opts] [paths] | xargs -0 -n 1 -I {} [command]
  • fswatch -0 将使用 NUL 字符拆分记录。

  • xargs -0 将使用 NUL 字符拆分记录。这是正确匹配所必需的 阻抗与 fswatch.

  • xargs -n 1 将调用每条记录的命令。如果你想每 x 记录做一次,那么 使用 xargs -n x.

  • xargs -I {} 会将命令中出现的 {} 替换为已解析的参数。如果 你是运行的命令不需要事件路径名,把这个选项删掉即可。 如果您更喜欢使用其他替换字符串,请将 {} 替换为您的字符串。

你是对的,OS X 在 /Volumes 中安装网络驱动器

获取文件更改更新的方法是使用File System Events API。它是基于 C 的 API,您可以在其中监视特定目录(甚至 /)中的所有更改。

您将使用 FSEventStreamCreate and starting it with FSEventStreamScheduleWithRunLoop

创建流

准备好深入研究头文件,因为在参考文档中有更多文档

据我所知,Finder 可能使用了一些内部 API 或 kernel queues,它们的设置比 FSEvents.h 的更高级别 API 更复杂

有一个很好的 GUI 可以帮助您了解整个事件是如何发生的。它叫做 fseventer by fernlightning(尚未 Yosemite 准备好)