NSSavePanel
我使用以下代码创建了一个:
NSSavePanel *savePanel = [NSSavePanel savePanel];
savePanel.delegate = self;
savePanel.directoryURL = ...;
savePanel.nameFieldStringValue = ...;
[savePanel beginSheetModalForWindow:self.window
completionHandler:^(NSInteger returnCode) {
if (returnCode == NSFileHandlingPanelOKButton) {
// the completion handler
}
}];
如果用户在保存面板中选择了一个已经存在的文件,则会出现警告框““XXX”已经存在。您要替换它吗?”。
如果用户按下“替换”按钮,则在完成处理程序中,使用 的removeItemAtPath:error:
方法删除旧文件NSFileManager
,然后创建新文件(实际上:它是在临时位置创建的,然后使用moveItemAtPath:toPath:error:
方法移动,但我认为这只是一个实现细节):
if (returnCode == NSFileHandlingPanelOKButton) {
// overwrite the url, because if we are here is because the user has already
// expressed its willingness to overwrite the previous file
NSError *error = nil;
BOOL res = [[NSFileManager defaultManager] removeItemAtURL:savePanel.URL error:&error];
if (res) {
res = [[NSFileManager defaultManager] moveItemAtPath:tmpFilePath toPath:savePanel.URL error:&error];
}
// ...
}
过去,一切都一直正常运行。然而,今天,我开始使用具有“读/写访问”权限的 Lion's Sandbox。
使用沙箱,removeItemAtPath:error:
是成功的,但以下moveItemAtPath:toPath:error:
返回错误。
这似乎是合理的,因为 Powerbox 赋予我访问(读取和写入)文件的权限。当我删除此文件时,授予我的权利已用尽。
我的猜测对吗?
我怎么解决这个问题?