MoveFileEx с MOVEFILE_DELAY_UNTIL_REBOOT удаляет, а не перемещает

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

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

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

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


person Charles    schedule 18.06.2009    source источник


Ответы (1)


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

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

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

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

person devdimi    schedule 18.06.2009
comment
+1 поместить файлы в подкаталог каталога приложения в ожидании перезагрузки - person sean e; 18.06.2009
comment
Что ж, после некоторых исследований я думаю, что единственное решение состоит в том, чтобы сделать то, что вы предложили: убедитесь, что исходные файлы находятся на одном томе, прежде чем вызывать MoveFileEx. Я думаю, это не слишком хлопотно, поскольку у службы есть необходимый доступ. Спасибо за совет. - person Charles; 19.06.2009