【问题标题】:Difference between writing to file atomically and not以原子方式写入文件与不写入文件之间的区别
【发布时间】:2010-04-24 15:48:02
【问题描述】:

objective-c 在 iPhone 上以原子方式写入文件有什么区别,两者之间有什么性能差异吗?

【问题讨论】:

    标签: iphone objective-c file-io


    【解决方案1】:

    原子一般意味着操作不能被中断将完成或没有效果。写入文件时,通过写入临时文件,然后在写入完成时将原始文件替换为临时文件来完成。

    写入原子文件时发生崩溃意味着原始文件未被修改,并且存在可以删除的垃圾文件。正常写入时崩溃意味着预期的好文件已损坏。

    在性能方面,成本是最低的。在写入期间,您将拥有一个文件的两个副本。文件替换是文件系统级别的一个非常简单的操作。

    编辑:谢谢zneak

    【讨论】:

    • 原子的意思是操作要么全部发生,要么根本不发生。它可以被中断、停止或恢复,它只是在完成之前不会改变系统的状态。不过,结论还是一样。
    • 我不会将其表述为“您将拥有一个文件的两个副本”,因为它太容易理解为意味着完全相同数据的两个副本,这不是正在发生的事情。
    【解决方案2】:

    以原子方式编写需要更多步骤 - 额外创建辅助文件。 NSString 类Reference 解释:

    如果是,接收器被写入一个辅助文件,然后 辅助文件重命名为路径。如果否,接收者被写入 直接进入路径。 YES 选项保证该路径,如果它存在于 全部,即使系统在运行期间崩溃也不会损坏 写作。

    下面是 pLists 的例子:

    [array writeToFile:path atomically:YES];
    

    当“YES”时,即使你在 XCode 中多次运行代码,pList 也只会更新一次,

    [array writeToFile:path atomically:NO];
    

    当“否”时,它会根据您运行相同的代码(重复更新)进行更新。

    【讨论】:

    • 不知道为什么有些人在没有任何解释的情况下否决了答案。
    • 我认为是因为他们认为您不应该依赖 API 的无证复杂性来克服严重的编程错误。
    • 感谢您的评论,我解释得更清楚了。
    • 我只是删除了关于写几次的东西,因为它无关紧要
    【解决方案3】:

    文件系统不必为原子写入而求助于写入/重命名周期。具有锁定语义的文件系统允许您“锁定”文件的部分或全部,或者在某些情况下甚至可以执行附加到文件之类的操作,以帮助实现原子性。

    @Randy,您对碎片的假设都可能是错误的。在大多数文件系统上,写入整个文件并关闭它会导致文件碎片更少,而在一次写入中写入大文件肯定会更好地使用大块。如果您的意思是文件块更有可能在磁盘上“爬行”,那取决于文件系统中的布局首选项。如果您正在写入闪存,您可能希望文件系统在可用存储空间中爬行,作为写入的一种自我平衡。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-17
      • 2012-05-05
      • 1970-01-01
      • 2012-08-14
      • 2012-04-05
      • 2019-06-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多