我正在生成一个 PDF 文档并为用户提供将其保存到磁盘的选项。我向他们展示了一个NSSavePanel
供他们选择要保存的文件名。如果他们选择了一个已经存在的文件,它会提示他们是否确定并想要替换该文件。如果他们同意替换文件,那么我会生成 PDF 并将其写入所选的 URL。
但是,我的写入失败并出现以下错误:
CGDataConsumerCreateWithFilename: failed to open `/path/to/.myfile.pdf' for writing: Operation not permitted
我有适当的权利来写入磁盘上的文件。碍事的文件是我在之前的测试中生成的文件。在将我的文件写入该 URL 之前,我是否需要明确删除现有文件,或者有什么方法可以告诉系统它可能会覆盖现有文件?
这是我用来启动的NSSavePanel
代码(我的代码保存他们最后选择的目录,以便它可以默认为所有未来保存的相同位置):
- (NSURL*) requestSaveFilenameForExtension:(NSString*)fileExtension previousSaveDirectorySettingKey:(NSString*)previousDirectorySettingKey defaultFilename:(NSString*)defaultFilename {
NSSavePanel *panel = [NSSavePanel savePanel];
[panel setAllowedFileTypes:[NSArray arrayWithObject:fileExtension]];
NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSString *previousSaveDirectory = [defaults stringForKey:previousDirectorySettingKey];
if (previousSaveDirectory == nil) {
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
previousSaveDirectory = [paths objectAtIndex:0];
}
[panel setExtensionHidden:NO];
[panel setNameFieldStringValue:defaultFilename];
[panel setDirectoryURL:[NSURL fileURLWithPath:previousSaveDirectory]];
NSInteger ret = [panel runModal];
if (ret == NSFileHandlingPanelOKButton) {
NSString *saveDirectory = [[[panel URL] absoluteString] stringByDeletingLastPathComponent];
[defaults setValue:saveDirectory forKey:previousDirectorySettingKey];
return [panel URL];
} else {
return nil;
}
}
这是我用来将文件写入给定 URL 的代码,它只是标准的 PDFKit -writeToURL:
:
PDFDocument *document = [self generateDocument];
[document writeToURL:documentURL];