如果文件已存在,我想覆盖它。如果它不存在,我想创建它并写入它。我宁愿不必使用像lockfile这样的第三方库(它似乎可以处理所有类型的锁定。)
我最初的想法是:
答案 0 :(得分:4)
os.Rename
调用syscall.Rename
,对于Linux / UNIX,它使用重命名系统调用(原子*)。在Windows syscall.Rename
调用MoveFileW
,假设源和目标位于同一设备(可以安排),文件系统是NTFS(通常是这种情况)是原子*。
我会注意确保源和目标位于同一设备上,因此Linux重命名不会失败,而Windows重命名实际上是原子的。正如Dave C提到的那样,在现有文件所在的目录中创建临时文件(通常使用ioutil.TempFile
)是可行的方法;这就是我进行原子重命名的方法。
这在我的用例中适用于我:
在上面的用例中,简单地使用os.Rename
对我来说非常有效。
进一步阅读:
*注意:我想指出当人们谈论原子文件系统文件操作时,从应用程序的角度来看,它们通常意味着操作发生或不发生({{3}从用户的角度来看,可以提供帮助)。如果您在原子内存操作意义上使用原子,很少有文件系统操作(在直接I / O [journaling之外]一个块写入和禁用磁盘缓冲的读取)可以被认为是真正的原子。