如何使文件创建成为原子操作?

发布于 2021-01-29 14:55:37

我正在使用Python通过一次操作将大块文本写入文件:

open(file, 'w').write(text)

如果脚本被中断,所以文件写入未完成,我希望没有文件,而不是部分完成的文件。能做到吗?

关注者
0
被浏览
170
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    将数据写入临时文件,并且在成功写入数据后,将文件重命名为正确的目标文件,例如

    f = open(tmpFile, 'w')
    f.write(text)
    # make sure that all data is on disk
    # see http://stackoverflow.com/questions/7433057/is-rename-without-fsync-safe
    f.flush()
    os.fsync(f.fileno()) 
    f.close()
    
    os.rename(tmpFile, myFile)
    

    根据文档http://docs.python.org/library/os.html#os.rename

    如果成功,重命名将是原子操作(这是POSIX要求)。在Windows上,如果dst已经存在,即使它是一个文件,也会引发OSError;当dst命名现有文件时,可能无法实现原子重命名

    如果src和dst在不同的文件系统上,则该操作在某些Unix风格上可能会失败。

    注意:

    • 如果src和dest位置不在同一文件系统上,则可能不是原子操作

    • os.fsync 如果在电源故障,系统崩溃等情况下,性能/响应能力比数据完整性更重要,则可以跳过该步骤



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看