我有一个基本的 Cocoa 应用程序,让用户管理文件列表。文件是通过拖放添加的,并且我在应用程序重新启动时将访问权限保留在安全书签中。
到目前为止,一切都很好。允许应用程序读取和写入用户的文件,但重命名失败并出现权限错误,声称不允许我的应用程序访问父文件夹。
Code:
[[NSFileManager defaultManager] moveItemAtPath:currentPath
toPath:newPath error:&error]
Error:
Error Domain=NSCocoaErrorDomain Code=513 "“Some image.jpg” couldn’t
be moved because you don’t have permission to access “some folder”
我发誓这在昨天还有效,没有任何改变......(请参阅下面的更新)
反正。我假设,如果用户允许通过“打开”对话框或拖放访问文件,则应允许沙盒应用程序重命名该文件。
UPDATE:
我终于设法将其追溯到我的代码中的更改:
当我打电话时我可以重现错误NSFileCoordinator.item(at: newSrcUrl, willMoveTo: newDstUrl)
在执行实际移动之前。如果我跳过这一步,一切都会再次正常运行,控制台中不会出现任何错误。
完整代码:
let coordinator = NSFileCoordinator()
coordinator.coordinate(writingItemAt: srcURL, options: .forMerging,
writingItemAt: dstURL, options: .forMerging) { newSrcUrl, newDstUrl in
// Calling this first results in "could not get a sandbox extension" error in console:
//coordinator.item(at: newSrcUrl, willMoveTo: newDstUrl)
try moveItem(at: newSrcUrl, to: newDstUrl)
coordinator.item(at: newSrcUrl, didMoveTo: newDstUrl)
}
item(at oldURL: URL, willMoveTo newURL: URL)
似乎是在更改文档的文件扩展名(例如 .rtf 到 .rtfd)时使用的,但我的应用程序并非如此。仅文件名发生变化,文件扩展名不变。我认为最好的做法是致电will/didMove
方法,不过貌似有副作用。
回顾一下,我的应用程序所做的就是要求用户打开一个文件夹(通过NSOpenPanel
所以我的应用程序获得写入该文件夹的权限),然后我的应用程序在该文件夹中创建一个文件,然后重命名它。