原子文件写操作(跨平台)

Qui*_*Par 26 python java file-io file

如何构建原子文件写操作?该文件由Java服务编写,并由python脚本读取.
对于记录,读取远远大于写入.但是写入分批发生并且往往很长.文件大小相当于兆字节.

现在我的方法是:

  • 将文件内容写入同一目录中的临时文件
  • 删除旧文件
  • 将临时文件重命名为旧文件名.

这是正确的方法吗?如何避免旧文件被删除但新文件名尚未重命名的情况?

这些编程语言(python和java)是否提供锁定和避免这种情况的构造?

Ste*_*n C 10

AFAIK没有.

原因在于,为了使这种原子操作成为可能,必须以事务文件系统的形式支持OS.并且主流操作系统都没有提供事务文件系统.

编辑 - 我至少对POSIX兼容的系统错了.rename如果具有目标名称的文件已存在,则POSIX 系统调用执行原子替换...如@janneb所指出的那样.这应该足以以原子方式执行OP的操作.

然而,事实仍然是Java File.renameTo()方法明确地保证是原子的,因此它不提供OP问题的跨平台解决方案.

编辑2 - 使用Java 7,您可以使用java.nio.file.Files.move(Path source, Path target, CopyOption... options)copyOptions和ATOMIC_MOVE.如果不支持(由OS /文件系统),则应该获得异常.

  • +1:啊,那些讨厌的操作系统差异阻止了“跨平台”解决方案。 (2认同)

jan*_*neb 5

至少在POSIX平台上,省略第3步(删除旧文件).在POSIX中,文件系统中的重命名保证是原子的,并且在现有文件之上重命名会原子地替换它.