gpt4 book ai didi

macos - NSFileWrapper writeToURL : fails with error "file already exists" - how to simply overwrite the existing file?

转载 作者:行者123 更新时间:2023-12-03 16:46:15 24 4
gpt4 key购买 nike

我正在尝试找出使用 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 时,上面的代码有效,但这会首先将整个内容写入临时文件,这是我想避免的。即使写入使用文件的硬链接(hard link),文件包内的目录也会发生变化,这会导致其他副作用(iCloud 报告变化,尽管实际上没有文件发生变化,只有目录 inode 发生变化)。

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

最佳答案

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

关于macos - NSFileWrapper writeToURL : fails with error "file already exists" - how to simply overwrite the existing file?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21699081/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com