挂载文件系统NSDirectoryEnumerator NSFileManager不一致 - 有子文件夹然后不?种族条件?

时间:2017-10-11 01:55:48

标签: macos cocoa filesystems nsfilemanager mount-point

我有一个目录观察程序,它在Mac OS X上使用FSEvents API,并轮询已安装服务器卷上的本地或远程目录以进行更改。它工作得很好,我可以创建一个NSSet的目录URL,它已被更改并需要遍历。它有一个回调机制,我用它来将一组已更改的URL提供给任何客户端。

我有一个特殊的场景,我无法解决已经安装的AFP或SMB卷的问题 - 这告诉我我对某些事情有误解。

1 - 目录观察者正确地注意到目录内容已更改(我手动移动了一些内容),它遍历监视文件夹中的顶级目录并返回一个新的NSURL *数组。在我的调试中,此列表从未不准确。

2 - 我的应用程序,Directory Watcher的客户端然后枚举上述数组中的每个URL。如果URL存在(我之前应该将其枚举),请将其复制到临时文件夹进行处理。

代码:

目录观察者:https://github.com/Synopsis/Synopsis-Framework/blob/master/Synopsis/Synopsis/Utilities/SynopsisDirectoryWatcher.m

客户端应用程序调用有时会失败: https://github.com/Synopsis/Synopsis-Analyzer/blob/master/Synopsis/Synopsis/AppDelegate.m#L497

我遇到的问题是,我刚收到通知的目录已经更改,并且成功枚举,并且可以在Finder中看到,无法复制,因为它根据NSFileManager不存在。如果且仅当目录位​​于远程安装的文件服务器(Mac Mini,Mac OS 10.10,触摸过时且速度较慢)时,步骤2将失败~3次中的3次。对于本地更改,我没有任何问题,对于许多其他服务器,我还没有看到 这个问题。

这是一个日志:

Log File

请注意,正确枚举了文件夹Watch文件夹,找到了SESSION_1文件夹。

尝试复制,NSFileManager现在说找不到同一路径的SESSION_1。

安全信息记录是由于HFS +扩展属性未通过此版本的AFP复制。该副本在4次中有3次成功。

NSFileManager目录Enumerator如何返回有效的现有文件夹结构,然后NSFileManager copyItemAtURL告诉我URL无效?

  • 我正在使用相同的NSFileManager ive alloc inited。
  • 我是文件管理员的代表,处理复制错误/继续
  • 我已经尝试在目录观察器之间等待一段时间并唤起回调,以便挂载的文件系统可以安定下来。
  • 我已经能够在复制之前检查有问题的文件夹上的NSURL资源属性,并且能够检索正确的值。
    • 我尝试过使用NSFIleCoordinate和NSFileCoordinatorReadingWithoutChanges

有些问题:

远程安装的文件系统上的Move操作是原子的吗?即,如果我将包含大量内容的目录从/ Volumes / Mount / Parent1 / child_a移动到/ Volumes / Mount / Parent2 / child_a - 目录内容是否处于不一致状态?

有没有办法“同步”NSFileManager来强制更新?

我应该使用较低级别的apis?

谢谢!

0 个答案:

没有答案