writeToFile:atomically: 会覆盖数据吗?
Posted
技术标签:
【中文标题】writeToFile:atomically: 会覆盖数据吗?【英文标题】:Will writeToFile:atomically: overwrite data? 【发布时间】:2011-10-20 00:56:41 【问题描述】:非常简单的问题,但在 Apple 的文档中似乎并不清楚。
writeToFile:atomically:
for NSData
、NSArray
等会覆盖文件上的现有数据吗?
【问题讨论】:
【参考方案1】:是的。 writeToFile:atomically:
会。
【讨论】:
您是否以原子方式执行并不重要;无论哪种情况,文件都将被新数据完全覆盖。 啊,但对我来说它失败了,原始文件完好无损。由于 writeToFile 不返回 NSError,我该如何调查失败?这可能是权限问题,但我不能确定。我的代码作为安装程序插件包运行,用于需要 root 权限的安装包——我不知道如何验证/打印我的代码运行的权限。 @MottiShneor 你可以使用 -writeToURL:options:error: 代替,它确实有一个错误参数。【参考方案2】:方法writeToFile:atomically:
总是覆盖文件,不管atomically:
是或否。
来自Apple docs 的信息(NSData,“保存数据”部分):
NSData 类及其子类提供了快速和 轻松将其内容保存到磁盘。为了最大限度地降低数据丢失的风险, 这些方法提供了以原子方式保存数据的选项。原子 写保证数据要么完整保存,要么 完全失败。原子写入首先将数据写入 临时文件。如果此写入成功,则该方法移动 临时文件到其最终位置。
没有关于检查文件是否存在的消息。
例如,对于docs(NSFileManager,讨论部分)中的方法copyItemAtPath:toPath:error:
,专门写了关于此类检查:
如果dstPath已经存在同名文件,这个方法 停止复制尝试并返回相应的错误。
【讨论】:
以上是关于writeToFile:atomically: 会覆盖数据吗?的主要内容,如果未能解决你的问题,请参考以下文章
writeToFile:atomically: 不保存新的 plist 数据