NSFileWrapper writeToURL:失败并显示错误“文件已存在” - 如何简单地覆盖现有文件?

时间:2014-02-11 10:21:47

标签: macos cocoa nsfilewrapper

我正在尝试找出使用NSFileWrapper保存文件包的最有效方法。

当我保存文件包装器时,我不使用原子写入并输入先前内容的URL。

但是,第二次写入总是失败并出现错误:“Code = 516”文件“test.package”无法保存在“tempfolder”文件夹中,因为已经存在同名文件。

NSError *error;
[wrapper writeToURL:fileURL options:0 originalContentsURL:fileURL error:&error];
STAssertNil(error, @""); // First time works (new file)

// Write a second time without changes
[wrapper writeToURL:fileURL options:0 originalContentsURL:fileURL error:&error];
STAssertNil(error, @""); // Fails with error 516, file already exists

当然文件第二次存在,因为我第二次保存它。我期望的是,保存成功而不必实际写出任何东西,因为内容没有改变。

上面的代码在我使用标志NSFileWrapperWritingAtomic时有效,但这会首先将整个内容写入临时文件,这是我想避免的。即使写入使用文件的硬链接,文件包中的目录也会改变,这会导致其他副作用(iCloud报告更改,尽管实际上没有文件更改,只有目录inode)。

是不是有某种标志让文件包装器只是非原子地覆盖现有文件?

1 个答案:

答案 0 :(得分:0)

您可以复制NSDocument的安全保存以执行您想要的操作而不使用该标志。只需首先写入临时文件(这只会写入已更改的文件,并将其他所有内容硬链接),而不是使用NSFileManager的replaceItemAtURL:withItemAtURL:backupItemName:options:resultingItemURL:error:

成功将临时文件移动到原始URL