我有一个目录观察程序,它在 Mac OS X 上使用 FSEvents API,还轮询已安装服务器卷上的本地或远程目录以进行更改。它工作得很好,我可以制作一个已更改且需要遍历的目录 URL 的 NSSet。它有一个回调机制,我用它来将一组更改的 URLS 提供给任何客户端。
我有一个特殊的场景,我无法理解安装 AFP 或 SMB 卷所发生的情况 - 这告诉我我对某些事情有误解。
1 - Directory Watcher 正确地注意到目录内容已更改(我手动移动了一些内容),它遍历 watch 文件夹中的顶级目录并返回一个新的 NSURLs* 数组。在我的调试中,这个列表从来都不是不准确的。
2 - 我的应用程序,即 Directory Watcher 的客户端,然后枚举上述数组中的每个 URL。如果 URL 存在(我应该在刚才列举它)将其复制到临时文件夹进行处理。
代码 :
有时会失败的客户端应用程序调用: https ://github.com/Synopsis/Synopsis-Analyzer/blob/master/Synopsis/Synopsis/AppDelegate.m#L497
我遇到的问题是,我刚刚收到通知的目录已更改,并成功枚举,并且可以在 Finder 中看到,但无法复制,因为根据 NSFileManager,它不存在。当且仅当该目录位于远程安装的文件服务器上(Mac Mini、Mac OS 10.10、触摸过时且速度慢)时,第 2 步失败 4 次中的 3 次。对于本地更改,我没有问题,对于许多其他服务器,我根本没有看到这个问题。
这是一个日志:
注意文件夹Watch文件夹枚举正确,找到SESSION_1文件夹。
尝试复制,NSFileManager 现在说 SESSION_1 在同一路径未找到。
安全信息记录是由于 HFS+ 扩展属性未通过此版本的 AFP 复制。复制成功 4 次中的 3 次。
NSFileManager 目录枚举器如何返回有效的现有文件夹结构,然后 NSFileManager copyItemAtURL 告诉我 URL 无效?
- 我正在使用我分配的 NSFileManager 的相同实例。
- 我是我的文件管理器的代表,负责处理复制错误/继续
- 我尝试在目录观察程序和调用回调之间等待一段时间,以便挂载的文件系统可以稳定下来。
- 我已经能够在复制之前检查相关文件夹的 NSURL 资源属性,并且能够检索正确的值。
- 我尝试将 NSFIleCoordinate 与 NSFileCoordinatorReadingWithoutChanges 一起使用
一些问题:
Move 操作在远程挂载的文件系统上是原子的吗?即,如果我将包含大量内容的目录从 /Volumes/Mount/Parent1/child_a 移动到 /Volumes/Mount/Parent2/child_a - 目录内容是否一直处于不一致状态?
有没有办法“同步” NSFileManager 来强制更新?
我应该使用较低级别的api?
谢谢!