好的:我正在 iPhone OS 应用程序中实现文件共享,当然这意味着文件系统监控。耶!
基本上,当用户在 iTunes 中将文件操作到我的应用程序部分时,操作系统会从我可以访问的目录复制和/或删除。因此,我可能需要通过像kqueue()
.
如何实现这一点,以便我知道文件已完成复制?我的思路是:
- 用 监控
kqueue()
。 - 在事件中,开始(或重置现有)超时。
- 超时后,做工作。
但是有没有更好的方法来确保我不会踩到操作系统的脚趾?
好的:我正在 iPhone OS 应用程序中实现文件共享,当然这意味着文件系统监控。耶!
基本上,当用户在 iTunes 中将文件操作到我的应用程序部分时,操作系统会从我可以访问的目录复制和/或删除。因此,我可能需要通过像kqueue()
.
如何实现这一点,以便我知道文件已完成复制?我的思路是:
kqueue()
。但是有没有更好的方法来确保我不会踩到操作系统的脚趾?
这只是部分答案,但可能有些用处。
当应用程序的 Documents 目录被修改时,kqueue 机制确实可以作为一种通知方式。
一旦目录被修改并且在复制文件完成之前,通知就会出现。我在测试中观察到了这一点。
不幸的是,复制完成后没有任何形式的通知。至少,我没有找到。
我希望 Apple 会意识到需要通知“iTunes 同步”已完成,因为这似乎是一个普遍问题。
检查新文件的修改时间是否不变的循环可能有效,但仅在大多数情况下有效。在某些极端情况下,iOS 可以暂停在后台自行完成各种耗时的工作。
如果有办法检查某个特定文件是否被另一个进程打开,那么这就足够了。
杰夫
它使用调度源而不是队列,但工作正常。
自述文件:
文件系统事件发布者
跟踪文件系统更改的发布者。
示例用法:
let cancellable = DispatchSource.publish(
.all,
for: FileManager.default.temporaryDirectory
)
.receive(on: RunLoop.main)
.sink { event in
print(event)
}
//.
//.
//.
cancellable.cancel()