在 Cocoa/Cocoa Touch 中监控目录

Posted

技术标签:

【中文标题】在 Cocoa/Cocoa Touch 中监控目录【英文标题】:Monitoring a directory in Cocoa/Cocoa Touch 【发布时间】:2011-10-11 00:39:40 【问题描述】:

我正在尝试找到一种方法来监视目录内容的更改。我尝试了两种方法。

    使用kqueue监控目录 使用 GCD 监控目录

我遇到的问题是我找不到检测哪个文件已更改的方法。我正在尝试监视一个目录,其中可能包含数千个文件,我不想对每个文件都调用 stat 来找出哪些文件发生了变化。我也不想为该目录中的每个文件设置单独的调度源。目前可以吗?

注意:我用kqueue 和GCD 记录了我的实验监控文件

【问题讨论】:

您的目标是 Mac OS X 和 ios 吗? 我的目标是 OS X,但我也对它是否可以在 iOS 上运行感兴趣。 【参考方案1】:

我的建议是咬紧牙关,在另一个线程中进行目录扫描,即使您正在谈论数千个文件。但如果你坚持,这就是答案:

如果不卷起袖子去内核潜水,就没有办法做到这一点。

您的第一个选择是使用 FSEvents 框架,它会在文件被创建、编辑或删除(以及与属性有关的事情)时发出通知。概述是here,有人围绕API写了Objective C wrapper,虽然我没试过。但是概述没有提到关于file 更改的事件的部分,只是目录(如kqueue)。我最终使用来自here 的代码以及头文件here 来编译我自己的记录器,我可以使用它来获取单个文件级别的事件。您必须在应用中编写一些代码才能在后台运行记录器并对其进行监控。

另外,看看“fs_usage”命令,它会持续监控所有文件系统活动(我的意思是all)。这已经与 Darwin 一起提供了,因此您不必自己编译它。您可以使用 kqueue 来监听目录变化,同时监视来自“fs_usage”的输出。如果您从 kqueue 收到有关目录已更改的通知,您可以查看 fs_usage 的输出,查看写入了哪些文件,并根据已修改的目录检查文件名。 fs_usage 是一个消防软管,因此请准备好使用一些选项以及 Grep 来驯服它。

为了让事情变得更有趣,您的 FSEvents 记录器和 fs_usage 都需要 root 访问权限,因此您必须先获得用户的授权,然后才能在您的 OS X 应用程序中使用它们(查看Authorization Services Programming Guide 以获取有关信息怎么做)。

如果这一切听起来非常复杂,那是因为它是。但至少你不必费力地找出来!

【讨论】:

FSEvents 在 iOS 上可用吗? iOS 程序可以运行 fs_usage 之类的任意命令吗? 对于 iOS,FSEvents 并不是真正需要的——因为所有的应用程序都是沙盒的,所以没有任何文件系统事件不是您通过处理 Documents 中的文件引起的文件夹。我已经看到有关 iOS5 的注释表明您将能够在 iCloud 文件系统上使用 FSEvents。如果您谈论的是 越狱 手机(耳语),那么 FSEvents 可能会被发送出去,但快速的 Google 搜索是不确定的。我怀疑他们内置了像 fs_usage 这样的工具,但你可以自己编译一个......

以上是关于在 Cocoa/Cocoa Touch 中监控目录的主要内容,如果未能解决你的问题,请参考以下文章

静态 cocoa/cocoa-touch 库应该基于啥样的 SDK?

是否需要用户界面才能在 Cocoa 中进行全局事件监控?

Cocoa 线程和类声明连接

kvc和kvo的使用情况的了解

可可:像窗口一样停靠

NSSound 无法正常工作