使用kqueue()监视目录中的更改的最佳方法是什么?

时间:2010-06-04 08:34:12

标签: iphone macos directory monitoring kqueue

好的:我正在iPhone OS应用程序中实现文件共享,当然这意味着文件系统监控。耶!

基本上,当用户将文件操作到iTunes中我的应用程序部分时,操作系统会复制和/或删除目录。因此,我需要通过像kqueue()这样的有效机制来监视目录中的变化。

如何实现此功能,以便我知道文件已完成复制?我在思考:

  • 使用kqueue()进行监控。
  • 在事件中,启动(或重置现有)超时。
  • 超时时,请继续工作。

但有没有更好的方法来确保我不会踩到操作系统的脚趾?

2 个答案:

答案 0 :(得分:3)

这只是部分答案,但可能有点用处。

  1. 当应用程序的Documents目录被修改时,kqueue机制确实可以作为通知的手段。

  2. 在修改目录并完成复制文件之前,会立即发出通知。我在测试中发现了这一点。

  3. 不幸的是,复制完成后没有任何形式的通知。至少,没有我找到的。

    我希望Apple能够意识到需要通知“iTunes同步”,因为这似乎是一个普遍的问题。

    检查新文件的修改时间是否未更改的循环可能有效,但仅在大多数情况下有效。在某些极端情况下,iOS可以暂停在后台进行各种耗时的工作。

    如果有办法检查某个特定文件是否被其他进程打开,那么这就足够了。

    杰夫

答案 1 :(得分:0)

I just implemented this

它使用调度源而不是队列,但工作正常。

自述文件:

文件系统事件发布者

跟踪文件系统变化的发布者。

示例用法:

let cancellable = DispatchSource.publish(
  .all,
  for: FileManager.default.temporaryDirectory
)
.receive(on: RunLoop.main)
.sink { event in
  print(event)
}
//.
//.
//.
cancellable.cancel()