Возможно ли переименование атомарного файла (с перезаписью) в Windows? - PullRequest
62 голосов
/ 03 октября 2008

В системах POSIX переименование (2) предусматривает атомарную операцию переименования, включая перезапись файла назначения, если он существует и если разрешения позволяют.

Есть ли способ получить такую ​​же семантику в Windows? Я знаю о MoveFileTransacted () в Vista и Server 2008, но мне нужно это для поддержки Win2k и выше.

Ключевое слово здесь: atomic ... решение не должно быть способным завершиться сбоем любым способом, который переводит операцию в противоречивое состояние.

Я видел много людей, которые говорили, что это невозможно на win32, но я спрашиваю вас, правда ли это?

Пожалуйста, предоставьте надежные ссылки, если это возможно.

Ответы [ 6 ]

33 голосов
/ 03 марта 2010
16 голосов
/ 03 октября 2008

Win32 не гарантирует элементарных операций с метаданными файла. Я бы привел цитату, но ее нет - тот факт, что нет письменной или документированной гарантии, означает столько же.

Вы должны написать свои собственные подпрограммы для поддержки этого. Это прискорбно, но вы не можете ожидать, что win32 обеспечит такой уровень обслуживания - он просто не предназначен для этого.

15 голосов
/ 19 марта 2009

В Windows Vista и Windows Server 2008 была добавлена ​​функция атомарного перемещения - MoveFileTransacted ()

К сожалению, это не помогает с более старыми версиями Windows.

Интересная статья здесь на MSDN .

9 голосов
/ 03 октября 2008

у вас все еще есть вызов rename () в Windows, хотя я думаю, что гарантии, которые вы хотите, не могут быть сделаны без знания используемой вами файловой системы - без гарантий, например, если вы используете FAT.

Однако вы можете использовать MoveFileEx и использовать MOVEFILE_REPLACE_EXISTING и варианты MOVEFILE_WRITE_THROUGH. Последний имеет это описание в MSDN:

Установка этого значения гарантирует, что переместить выполненную как копию и удалить операция сбрасывается на диск перед функция возвращает. Прилив происходит в конце операции копирования.

Я знаю, что это не обязательно то же самое, что операция переименования, но я думаю, что это может быть лучшей гарантией, которую вы получите - если она делает это для перемещения файла, то для более простого переименования.

2 голосов
/ 08 августа 2018

Начиная с Windows 10 1607, NTFS поддерживает атомарную операцию переименования. Для этого вызовите NtSetInformationFile (..., FileRenameInformationEx, ...) и укажите флаг FILE_RENAME_POSIX_SEMANTICS. Или эквивалентно в Win32 вызовите SetFileInformationByHandle (..., FileRenameInfoEx, ...) и укажите флаг FILE_RENAME_FLAG_POSIX_SEMANTICS.

2 голосов
/ 01 июля 2014

Достаточное количество ответов, но не тот, который я ожидал ... У меня было понимание (возможно, неверное), что MoveFile может быть атомным, при условии, что были выровнены правильные звезды, использовались флаги и файл Система была такой же в источнике, как цель. В противном случае операция вернется к файлу [Copy-> Delete].

Учитывая это; Я также понимал, что MoveFile - когда он атомарный - просто устанавливает информацию о файле, что также можно сделать здесь: setfileinfobyhandle .

Кто-то выступил с докладом под названием " Racing the Filesystem ", в котором более подробно рассказывается об этом. (примерно на 2/3 ниже они говорят об атомном переименовании)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...