【问题标题】:Observe a File or Folder in Objective-C在 Objective-C 中观察文件或文件夹
【发布时间】:2010-11-26 01:59:57
【问题描述】:

收听文件夹或文件以查看它是否已保存或是否已添加新文件的最佳方法是什么?

【问题讨论】:

    标签: objective-c cocoa observer-pattern


    【解决方案1】:

    如果您只想监视目录但不处理单个文件的监视,则 FSEvents API 是理想的选择。 Stu Connolly 为 FSEvents C API 提供了一个很棒的 Objective-C 包装器,它被称为 SCEvents,你可以在这里获得它:

    http://stuconnolly.com/blog/scevents-011/

    FSEvents 的好处在于,您只需要查看一个文件夹,您就会收到该文件夹​​的子文件夹层次结构中任何位置发生的任何更改的通知。

    如果您需要文件级通知,则需要使用 kqueue。 Uli Kusterer 有一个很棒的 Objective-C 包装器:

    http://zathras.de/angelweb/sourcecode.htm#UKKQueue

    这两种方法中的任何一种都比直接使用 C API 容易得多,因为 C API 没有特别详细的文档并且有点迟钝。

    如果您需要支持 Tiger,则需要使用 kqueue,因为 FSEvents API 在 10.4 中并未正式提供。

    【讨论】:

    • 自 Mac OS 10.7 Lion 以来情况发生了变化。 FSEvents 现在支持文件级粒度,在创建事件流时使用 kFSEventStreamCreateFlagFileEvents 标志来获取有关特定文件更改的通知。 FSEvent 指南没有反映这些变化,但Reference 会。
    • 沙盒限制怎么样?是否可以获得系统中任何路径的通知? (用户使用特殊对话框选择后)
    • 好问题。我相信如果您使用NSOpenPanel(即Powerbox)选择了一个文件夹,那么您应该能够毫无问题地观察它的变化。
    【解决方案2】:

    尝试使用FSEvents,虽然它是一个 C API

    操作系统 10.5 或更新版本

    【讨论】:

    • 这些天在 github 上有很多 FSEvent 包装器库。即使是斯威夫特
    【解决方案3】:

    如果您确实需要使用 kqueue(如其他答案中所述)Google Toolbox for Mac 有一个 nice Objective-C wrapper,到目前为止我使用它没有任何问题。

    【讨论】:

      【解决方案4】:

      如果您要更改文件或文件夹,我相信Spotlight 搜索引擎会更新其数据库以反映您的更改。

      因此,您可以设置一个线程,通过特定于该文件或文件夹的Spotlight query 侦听kMDQueryDidUpdateNotification 通知。

      当你收到这些通知时,你可以触发一个选择器来做你想做的事情。

      【讨论】:

      • 这是个好主意,但 Spotlight 的问题在于并非所有卷都支持它(尤其是许多网络卷),而且用户也有关闭它的习惯。
      • 您也可能在聚光灯下拥有处于私有模式的卷。不过很高兴有这个想法。竖起大拇指!
      【解决方案5】:

      不确定什么是最好的方法,但是一种方法是启动一个 NSThread,它会定期(例如每秒)检查目录中文件的创建日期,然后有一个与该线程关联的委托添加新文件时执行一些操作

      【讨论】:

      • 这是轮询,不鼓励。请改用 FSEvents 或 kqueues,它们是专门为此目的设计的 API。
      • 不鼓励使用轮询,但它也是唯一可靠的技术。当文件被另一台机器修改时,轮询将一直工作,即使在网络卷上也是如此。每个人至少应该考虑使用它。
      • “唯一可靠的技术”需要详细说明吗?监听中心事件似乎是更好的选择。电池明智的。
      猜你喜欢
      • 1970-01-01
      • 2021-09-28
      • 1970-01-01
      • 1970-01-01
      • 2022-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-12-23
      相关资源
      最近更新 更多