我有一个目录观察程序,它在Mac OS X上使用FSEvents API,并轮询已安装服务器卷上的本地或远程目录以进行更改。它工作得很好,我可以创建一个NSSet的目录URL,它已被更改并需要遍历。它有一个回调机制,我用它来将一组已更改的URL提供给任何客户端。
我有一个特殊的场景,我无法解决已经安装的AFP或SMB卷的问题 - 这告诉我我对某些事情有误解。
1 - 目录观察者正确地注意到目录内容已更改(我手动移动了一些内容),它遍历监视文件夹中的顶级目录并返回一个新的NSURL *数组。在我的调试中,此列表从未不准确。
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将失败~3次中的3次。对于本地更改,我没有任何问题,对于许多其他服务器,我还没有看到 这个问题。
这是一个日志:
请注意,正确枚举了文件夹Watch文件夹,找到了SESSION_1文件夹。
尝试复制,NSFileManager现在说找不到同一路径的SESSION_1。
安全信息记录是由于HFS +扩展属性未通过此版本的AFP复制。该副本在4次中有3次成功。
NSFileManager目录Enumerator如何返回有效的现有文件夹结构,然后NSFileManager copyItemAtURL告诉我URL无效?
有些问题:
远程安装的文件系统上的Move操作是原子的吗?即,如果我将包含大量内容的目录从/ Volumes / Mount / Parent1 / child_a移动到/ Volumes / Mount / Parent2 / child_a - 目录内容是否处于不一致状态?
有没有办法“同步”NSFileManager来强制更新?
我应该使用较低级别的apis?
谢谢!