我正在尝试找出使用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)。
是不是有某种标志让文件包装器只是非原子地覆盖现有文件?
答案 0 :(得分:0)
您可以复制NSDocument的安全保存以执行您想要的操作而不使用该标志。只需首先写入临时文件(这只会写入已更改的文件,并将其他所有内容硬链接),而不是使用NSFileManager的replaceItemAtURL:withItemAtURL:backupItemName:options:resultingItemURL:error:
成功将临时文件移动到原始URL