当前位置: 首页 > 面试题库 >

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

颜华池
2023-03-14
问题内容

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

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

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


问题答案:

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

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 如果在电源故障,系统崩溃等情况下,性能/响应能力比数据完整性更重要,则可以跳过该步骤



 类似资料:
  • 我已经使用quarkus maven插件创建了一个quarkus应用程序。 我的maven pom如下: 但是,当我尝试使用 ,我会收到以下错误消息,独立于平台。 我承认我没有创建任何类型的主类,因为quarkus似乎不需要它。但是我如何向Java平台声明我打算让quarkus决定主类呢? 编辑为了回应c. twitter,这里有更多的信息 内容是 我很确定你们中的一些人会要求清单。MF含量 我认

  • 我想了解在使用内部文件时编写java项目的最佳技术或标准技术。准确地说,我想开发一个使用程序运行时需要的文本文件和图像的项目。我的目标是从项目中创建一个可运行的jar,其中用户不需要看到所有这些文件。因此,我决定创建一个名为resources的包,并将其放在包含源代码的文件夹中。即。它与其他包处于同一级别。现在,在我的代码中,当我想要使用图像时,我使用以下语句:URL URL=getClass()

  • 我正在尝试将Heroku与Java结合使用,我有这个目录结构,我正在使用IntelliJ: 在程序文件中: 当我尝试heroku本地网站时,我得到“” 然而,它确实存在。我在用Windows。

  • 一个项目可以有很多 JAR 文件,你可以向项目中添加 WAR , ZIP 和 TAR 文档,使用归档任务可以创建这些文档: Zip , Tar , Jar , War 和Ear. 它门都以同样的机制工作. 例 15.19 创建一个 ZIP 文档 build.gradle apply plugin: 'java' task zip(type: Zip) { from 'src/dist'

  • 问题内容: 在纯Java6中为大型文件创建SHA-1的最佳方法是什么?如何实现此方法: 问题答案: 使用类并逐个提供数据。下面的示例忽略了诸如将byte []转换为字符串并关闭文件之类的细节,但是应该给了您大致的理解。

  • 我需要向我的文件添加一些规则。然而,我在我的项目文件夹中找不到它。它不是由Xcode自动创建的吗?如果不是,什么命令允许我创建一个?