5

ファイルの内容を置き換えるために私が考えることができる最も素朴で最悪の方法は次のとおりです。

f = open('file.txt', 'w')
f.write('stuff')
f.close()

明らかに、その操作が閉じる前のある時点で失敗した場合、元のファイルの内容は失われますが、必ずしも新しい内容が完成するとは限りません。

それで、これを行うための完全に適切な方法は何ですか(ある場合)。次のようなものだと思います。

f = open('file.txt.tmp', 'w')
f.write('stuff')
f.close()
move('file.txt.tmp', 'file.txt') # dangerous line?

しかし、それは完全にアトミックで安全ですか? 実際に移動を実行するための適切なコマンドは何ですか? への接続が開いている別のプロセスがある場合file.txt、それが閉じるまで元のファイルへのポインターを保持すると想定します。移動中に別のプロセスが開こうとした場合はどうfile.txtなりますか?

プロセスが完全で破損していないバージョンを取得する限り、プロセスが取得するファイルのバージョンはあまり気にしません。

4

1 に答える 1

5

の実装では、アトミックな関数moveを使用する必要があります。renameファイルを開くプロセスは、古いコンテンツまたは新しいコンテンツのいずれかを参照します。中間の状態はありません。プロセスが既にファイルを開いている場合、プロセスは の後に古いバージョンにアクセスし続けますmove

于 2012-11-01T22:16:35.033 に答える