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

Posted

技术标签:

【中文标题】使用 kqueue() 监视目录更改的最佳方法是啥?【英文标题】:What is the optimal way to monitor changes in a directory with a kqueue()?使用 kqueue() 监视目录更改的最佳方法是什么? 【发布时间】:2010-06-04 08:34:12 【问题描述】:

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

基本上,当用户在 iTunes 中将文件操作到我的应用程序部分时,操作系统会从我可以访问的目录复制和/或删除该目录。因此,我可能需要通过kqueue() 之类的有效机制来监视目录的更改。

如何实现这一点,以便我知道文件已完成复制?我的想法是:

使用kqueue()监控。 在事件中,开始(或重置现有)超时。 超时后,开始工作。

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

【问题讨论】:

【参考方案1】:

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

    kqueue 机制确实可以作为一种在应用程序的 Documents 目录被修改时收到通知的方法。

    一旦目录被修改并且在复制文件完成之前就会发出通知。我在测试中观察到了这一点。

很遗憾,复制完成后没有任何形式的通知。至少,我没有找到。

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

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

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

杰夫

【讨论】:

【参考方案2】:

I just implemented this

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

自述文件:

文件系统事件发布者

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

示例用法:

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

//.
//.
//.
cancellable.cancel()

【讨论】:

以上是关于使用 kqueue() 监视目录更改的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

监视 Azure 虚拟机上运行的服务/应用程序的最佳方法是啥

监视数据库更改的最佳方法

在linux中监视文件系统更改的最佳方法

使用 Subversion 回滚更改集的最佳方法是啥?

在我的网站上使用的所有纸张元素中全局更改墨水颜色的最佳方法是啥?

Qt Quick - 在组件状态更改时动画图像转换的最佳方法是啥?