Существует ли не-платформенный способ выполнения атомарного «переименования File1 в File2, если File2 не существует, иначе дайте ошибку»? Я знаю, что могу просто проверить, существует ли File2, а затем переименовать файл, если это не так, но это приводит к потенциальному состоянию гонки, когда какой-либо другой процесс создает File2 между проверкой и rename()
.C кросс-платформенная функция renameat2() rename-if-not-exist
Под Linux есть функция renameat2()
, которая выполняет именно это с установленным флагом RENAME_NOREPLACE
. К сожалению, manpage говорит
renameat2() предназначен для Linux.
Я даже не знаю, поддерживают ли все реализации libc этот вызов или только glibc.
Для моего использования, переименования внутри одного и того же каталога достаточно, мне не нужно иметь поддержку для перехода на совершенно другой путь.
Это потенциально связано с https://stackoverflow.com/a/230581/5562035 и Atomically swap contents of two files on Linux
Атомный в каком смысле? Обратите внимание, в частности, что документы Linux для 'rename()' и 'renameat()' специально отмечают, что «там, вероятно, будет окно, в котором оба« oldpath »и« newpath »относятся к переименоваемому файлу». –
Используйте здравый смысл. –
Между проверкой наличия целевого файла и переименования, в котором другой процесс мог создать целевой файл, не должно быть временного окна. Без этого условия вы могли бы просто «if (! File_exists (path_2)) {rename (path_1, path_2)}' – buggy3