5

我正在生成一个 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];
4

1 回答 1

0

我遇到了同样的问题。转到应用程序目标功能:将文件访问权限和访问权限检查为所有文件夹的“读/写”。

然后您的应用程序将有权在用户选择、下载、图片、音乐和电影文件夹中写入文件。不是其他文件夹。

并且推荐使用“NSSavePanel”与用户交互保存文件,这样你会在构建项目时得到提示,访问权限是否设置正确。否则最终会报错就像现在一样,不知道为什么。糟透了。。

于 2021-02-06T13:51:54.303 回答