Можно ли переименовать атомный файл (с перезаписью) в Windows?

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

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

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

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

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

Ответ 1

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

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

Ответ 3

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

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

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

Ответ 4

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

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

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

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

Ответ 5

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

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

Это НЕ покрывает случай замены, хотя

Ответ 6

"Соответствующий отрывок из этой исследовательской работы MS:" Under.... "

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