MoveFileEx с MOVEFILE_DELAY_UNTIL_REBOOT удаляет, а не перемещает - PullRequest
4 голосов
/ 18 июня 2009

У меня есть автоматическая система обновления, которая заменяет мои существующие программные файлы при перезагрузке. (Достаточно сказать, что это очень сложная программа со многими драйверами, службами и модулями уровня пользователя. Иного пути нет. Поверьте мне.)

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

Теперь в документации к MoveFileEx я вижу, что MOVEFILE_COPY_ALLOWED следует использовать при перемещении файла с одного тома на другой. Но также говорится, что флаг нельзя использовать с MOVEFILE_DELAY_UNTIL_REBOOT.

В: Как я могу переместить файл при перезагрузке, перезаписав существующий файл, если источник и цель не находятся на одном и том же томе?

1 Ответ

2 голосов
/ 18 июня 2009

Почему бы вам просто не скопировать файлы на диск, на котором пользователь установил вашу программу?

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

Поиск места для записи на том же диске может быть проблемой в Vista, но вы упомянули, что у вас есть службы - если они работают с привилегиями LocalSystem, попросите их записать новые файлы.

Еще один простой механизм обновления, который я использовал (хотя и не работает для драйверов), - это иметь специальную программу обновления - убить / завершить все, позволить программе обновления выполнить свою работу и запустить все заново.

...