アトミックに "File2が存在しない場合File1の名前をFile2に変更します。そうでなければエラーを返します"という非プラットフォーム固有の方法はありますか? File2が存在するかどうかを確認してファイル名を変更することはできますが、他のプロセスがチェックとrename()
の間にFile2を作成すると競合が発生する可能性があります。クロスプラットフォームのrenameat2()rename-if-not-exists機能
Linuxでは、RENAME_NOREPLACE
フラグが設定されている場合、これを正確に実行するrenameat2()
機能があります。残念ながら、マンページによれば、
renameat2()はLinux固有のものです。
すべてのlibc実装がこの呼び出しをサポートしているのか、glibcだけをサポートしているのかはわかりません。
私の用途では、同じディレクトリ内で名前を変更するだけで十分です。別のパスに移動する必要はありません。
これは潜在的にhttps://stackoverflow.com/a/230581/5562035とAtomically swap contents of two files on Linux
どのような意味で原子ですか?とりわけ、 'rename()'と 'renameat()'のLinuxドキュメントでは、 "oldpathとnewpathの両方がファイル名を変更しているウィンドウが存在するでしょう。 –
常識を使用してください。 –
ターゲットファイルが存在するかどうかのチェックと、別のプロセスがターゲットファイルを作成する際の名前変更の間には、時間枠が存在しないはずです。この条件がなければ、 'if(!file_exists(path_2)){rename(path_1、path_2)}' – buggy3