writeToFile:atomically: 会覆盖数据吗?

Posted

技术标签:

【中文标题】writeToFile:atomically: 会覆盖数据吗?【英文标题】:Will writeToFile:atomically: overwrite data? 【发布时间】:2011-10-20 00:56:41 【问题描述】:

非常简单的问题,但在 Apple 的文档中似乎并不清楚。

writeToFile:atomically: for NSDataNSArray 等会覆盖文件上的现有数据吗?

【问题讨论】:

【参考方案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 数据

增量写入 plist 文件

iPhone Objective C - 保存数据

将 NSMutableArray 保存到 iPhone 文档目录

iOS - 数据存储方式(本地化)

将文件名与文件扩展名 Cocoa 分开?