2009-06-18 4 views
4

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

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

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

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

ответ

2

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

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

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

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

+0

+1 помещаем файлы в поддиремент каталога приложений, ожидающих перезагрузки –

+0

Ну, после некоторых исследований, я думаю, что единственное решение должно делать то, что вы предложили: убедитесь, что исходные файлы находятся на том же томе перед вызовом MoveFileEx. Я думаю, это не слишком сложно, так как у службы есть необходимый доступ. Спасибо за совет. – Charles