【问题标题】:How to monitor file changes on network mapped drives?如何监视网络映射驱动器上的文件更改?
【发布时间】:2015-04-08 22:04:50
【问题描述】:

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

从该文件夹获取文件更改更新(删除/创建/更新)的正确方法是什么?

/dev/fsevents 会为此工作吗?

Finder 如何知道这些变化?

【问题讨论】:

  • 除非文件共享协议包含服务器通知客户端更改的方法(我不知道有任何协议这样做),否则这是不可能的。
  • 有道理,但仍然:Finder 是如何做到的?
  • @Gordon - NTFS 和 SMB 允许客户端通知更改(如​​果是运行 NTFS 的 Windows 系统,甚至映射网络驱动器)。但是我与运行 SAMBA 进行互操作的 Linux 机器不会触发该事件。因此,即使任何提供商都应该能够提供该功能,但它有点像只有 Microsoft 提供该功能。
  • @GordonDavisson OS X 本机 AFP 也发送通知,只需检查 fseventer 和我的 os x 客户端/服务器设置。
  • @Jamie 您是否正在寻找一种在 Cocoa 应用程序中实现此功能的方法? Swift 还是 ObjC?

标签: macos networking fsevents


【解决方案1】:

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

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

您可以使用FSEventStreamCreate 创建流并以FSEventStreamScheduleWithRunLoop 开头

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

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

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

【讨论】:

    【解决方案2】:

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

    fswatch /Volumes/MUSIC
    

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

    这是它的实际效果...首先我在顶部窗口中显示已安装的卷(并且 MUSIC 是基于 Samba 的),然后在左下方窗口中启动 fswatch,然后在文件系统在顶部窗口中,您可以在 Finder 中看到它们发生,还可以在左下方窗口中看到 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 {} 将用解析的参数替换命令中出现的 {}。如果 您正在运行的命令不需要事件路径名称,只需删除此选项即可。 如果您更喜欢使用其他替换字符串,请将 {} 替换为您的。

    【讨论】:

    • 感谢您提供详细的 fswatch 使用示例!我是从开发人员的角度提出这个问题的,但从用户的角度来看,您的回答很好。
    • @Mark fswatch 在将具有映射卷的远程计算机上的文件更改为 macos 时可以工作吗?我有一个 Windows 网络地图,当我从 mac comp 内部将文件更改到该目录时,fswatch 工作,但是当我使用物理路径上的 Windows 机器更改文件时,它不显示任何内容。
    • @ChristosLytras 抱歉,我不知道 - 我通常会尽量避免使用 Windows。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多