2

我试图找出使用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

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

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

难道没有某种标志可以让文件包装器简单地以非原子方式覆盖现有文件吗?

4

1 回答 1

0

您可以复制 NSDocument 的安全保存来做您想做的事情而不使用该标志。只需先写入临时文件(这只会写入已更改的文件,并将硬链接其他所有内容),而不是使用 NSFileManager 的replaceItemAtURL:withItemAtURL:backupItemName:options:resultingItemURL:error 成功将临时文件移动到原始 URL:

于 2014-02-11T23:31:44.847 回答