Как отменить отложенную операцию MoveFileEx?

#windows #delphi #winapi #delphi-7

#Windows #delphi #winapi #delphi-7

Вопрос:

Я использую приведенную ниже команду для удаления некоторых файлов после перезагрузки компьютера:

 MoveFileEx(PChar(File_Address), Nil, MOVEFILE_DELAY_UNTIL_REBOOT);
  

Как я могу отменить выполнение этой команды и предотвратить удаление файлов после перезагрузки?

Комментарии:

1. Похоже, что нет поддерживаемого способа сделать это. Что движет этим запросом?

2. Самый простой способ — не вызывать MoveFileEx удаление файла в первую очередь, пока вы не будете абсолютно уверены, что хотите его удалить.

Ответ №1:

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

Комментарии:

1. 1. Вы можете удалить запись из этого раздела реестра, используя класс TRegistry Delphi или API напрямую, но обратите внимание, что в Vista и выше для этого вам потребуется войти в систему как администратор (обычные пользователи не могут записывать / удалять из HKLM). Лучшим решением, конечно, является не создавать запись в первую очередь, пока вы не будете абсолютно уверены, что хотите удалить файл. 🙂

Ответ №2:

Я думаю, вы могли бы скопировать файл (поскольку он еще не был удален), а затем использовать

 MoveFileEx(copy_of_file, original_file, MOVEFILE_DELAY_UNTIL_REBOOT)
  

чтобы вернуть его на место во время перезагрузки.

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

Комментарии:

1. Это действительно задокументировано. «Операции перемещения и удаления выполняются во время загрузки в том же порядке, в котором они указаны в вызывающем приложении «.

2. @CodeCaster, спасибо, и хорошо заметил. Я отредактировал соответствующим образом.