アトミック ファイル書き込み操作を構築するにはどうすればよいですか? ファイルは Java サービスによって書き込まれ、Python スクリプトによって読み取られます。
記録によると、読み取りは書き込みよりもはるかに多くなります。ただし、書き込みはバッチで行われ、長くなる傾向があります。ファイル サイズはメガ バイトに達します。
現時点での私のアプローチは次のとおりです。
- ファイルの内容を同じディレクトリの一時ファイルに書き込む
- 古いファイルを削除する
- 一時ファイルの名前を古いファイル名に変更します。
これは正しいアプローチでしょうか? 古いファイルは削除されたが、新しいファイル名がまだ変更されていない状態を回避するにはどうすればよいでしょうか?
これらのプログラミング言語(PythonとJava) この状況をロックして回避するための構造を提供しますか?
ベストアンサー1
私の知る限り、いいえ。
その理由は、このようなアトミック操作を可能にするには、トランザクション ファイル システムの形で OS がサポートされている必要があるからです。しかし、主流のオペレーティング システムにはトランザクション ファイル システムを提供するものはありません。
編集- 少なくとも POSIX 準拠のシステムについては、私は間違っています。POSIXrename
システムコールは、ターゲット名のファイルがすでに存在する場合、アトミック置換を実行します... @janneb が指摘したように。OP の操作をアトミックに実行するにはこれで十分なはずです。
しかし、JavaFile.renameTo()
メソッドは明示的にないアトミックであることが保証されているため、OP の問題に対するクロスプラットフォーム ソリューションは提供されません。
編集2java.nio.file.Files.move(Path source, Path target, CopyOption... options)
- Java 7 では、copyOptions および を使用できますATOMIC_MOVE
。これがサポートされていない場合 (OS / ファイル システムによって)、例外が発生します。