SelfDeleting приложение в VC ++? - PullRequest
2 голосов
/ 07 июня 2010

Я хочу удалить папку, в которой находится запущенное приложение. Как мне это сделать..? есть ли способ сделать это? Т.е. папка, в которой находится приложение, должна быть удалена после завершения работы приложения?

Ответы [ 3 ]

4 голосов
/ 07 июня 2010

Лучше всего использовать Win32 API MoveFileEx . У него есть флаг, который можно установить для удаления файлов при их использовании при следующей перезагрузке, который называется MOVEFILE_DELAY_UNTIL_REBOOT. Установите новый параметр имени файла MoveFileEx на NULL, чтобы выполнить этот тип удаления.

Если dwFlags указывает MOVEFILE_DELAY_UNTIL_REBOOT и lpNewFileName имеет значение NULL, MoveFileEx регистрирует файл lpExistingFileName быть удаленным, когда система перезагружается.

Примечание. Используемые обычные файлы можно удалить в обычном порядке с помощью Win32 API DeleteFile в зависимости от того, были ли они открыты (с помощью Win32 API CreateFile) с разрешением FILE_SHARE_DELETE. Я не думаю, что запуск программ по умолчанию в Windows имеет такое разрешение. Если указан файл, который нужно удалить, который используется, но который был открыт с этим флагом, тогда этот файл будет удален, когда последний дескриптор файла будет закрыт.

1 голос
/ 07 июня 2010

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

Полный метод удаления вашего процесса можно найти здесь: http://www.handcraftedbytes.com/articles/writing-install-and-uninstall

Как уже отмечали другие, вы не сможете удалить папку, в которой находится ваш исполняемый файл, пока она там существует. Мое предложение:

  • Используйте MoveFileEx , чтобы переместить исполняемый файл во временный каталог,
  • удалить каталог вашего приложения,
  • удалите свой исполняемый файл, используя метод самоуничтожения DLL, описанный в ссылке выше.
0 голосов
/ 07 июня 2010

Вы не можете удалить исполняемый файл, который запущен в данный момент, однако вы можете удалить пакетный файл, который запущен в данный момент (cmd.exe загружает весь файл в память, а затем вы можете удалить его).

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...