在Cocoa / Cocoa Touch中监控一个目录

我试图find一种方法来监视目录的内容进行更改。 我已经尝试了两种方法。

  1. 使用kqueue来监视目录
  2. 使用GCD来监视目录

我遇到的问题是,我无法find一种方法来检测哪个文件已经改变。 我试图监视一个目录,其中可能有成千上万个文件,我不想每个都调用stat来找出哪些改变了。 我也不想为该目录中的每个文件设置单独的调度源。 目前这是可能的吗?

注意:我已经logging了使用kqueue和GCD监视文件的实验

我的build议是咬一口子,然后在另一个线程中进行目录扫描,即使你在谈论数千个文件。 但如果你坚持,这是答案:

没有办法做到这一点,没有卷起袖子,并进行核心潜水。

您的第一个select是使用FSEvents框架,该框架在创build,编辑或删除文件(以及与属性有关的事情)时发送通知。 概述在这里 ,有人写了一个围绕API的Objective C包装 ,虽然我还没有尝试过。 但是概述并没有提到关于文件变化的事件部分,只是目录(像使用kqueue)。 我最终使用这里的代码以及头文件在这里编译我自己的logging器,我可以使用它来获取单个文件级别的事件。 您必须在应用程序中编写一些代码才能在后台运行logging器并对其进行监控。

或者,看一看“ fs_usage ”命令,该命令会不断监视所有文件系统的活动(我的意思是全部 )。 这已经是达尔文了,所以你不必自己编译它。 您可以使用kqueue来侦听目录更改,同时监视“ fs_usage ”的输出。 如果你从kqueue得到一个目录已经改变的通知,你可以查看fs_usage的输出,查看哪些文件被写入,并检查文件名与修改的目录。 fs_usage是一个firehose,所以准备使用一些选项与Grep一起驯服它。

为了让事情变得更有趣,FSEventslogging器和fs_usage都需要root权限,所以你必须获得用户的授权才能在OS X应用程序中使用它们(查阅授权服务编程指南了解如何做到这一点)。

如果这一切听起来非常复杂,那是因为它。 但是至less你不需要找出困难的方式!