Как программа может удалить свой собственный исполняемый файл? - PullRequest
26 голосов
/ 22 октября 2009

Есть ли способ, которым запущенный процесс может удалить свой собственный исполняемый файл?

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

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

В любом случае, сделать это в Windows

Ответы [ 8 ]

19 голосов
/ 22 октября 2009

Один из способов сделать это - использовать функцию MoveFileEx с флагом MOVEFILE_DELAY_UNTIL_REBOOT и пунктом назначения NULL. Согласно документации это:

регистрирует файл lpExistingFileName , который будет удален при перезагрузке системы. Если lpExistingFileName относится к каталогу, система удаляет каталог при перезапуске, только если каталог пуст.

17 голосов
/ 03 ноября 2013
process.start("cmd /c ping localhost -n 3 > nul & del filepath")
exit

замените process.start любой командой, используемой вашим языком программирования для запуска программ с аргументами

заменить filepath на путь к вашему exe

замените выход на команду завершения вашей программы

5 голосов
/ 22 октября 2009

Это можно сделать в Linux. Вы обнаружите, что, как правило, невозможно удалить работающий исполняемый файл в Windows. Однако Windows может удалить для вас EXE-файл при следующей перезагрузке: http://www.howtodothings.com/computers/a1402-delete-a-running-exe.html

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

4 голосов
/ 22 октября 2009

Вы можете использовать планировщик Windows, чтобы запланировать задачу по удалению вашей программы через X секунд.

Командная строка: http://msdn.microsoft.com/en-us/library/bb736357%28VS.85%29.aspx

Или API: http://msdn.microsoft.com/en-us/library/aa383608%28VS.85%29.aspx

3 голосов
/ 22 октября 2009

Вы можете запустить другое приложение, которое будет ожидать завершения родительского процесса, а затем удалить его исполняемый файл.

0 голосов
/ 09 октября 2018

Хотя невозможно самостоятельно удалить файл, когда он запущен, можно запустить отдельную команду cmd из файла, а затем завершить файловую операцию до ее выполнения. Итак, если вы хотите удалить файл bat, вы можете просто добавить в конец файла строку: start cmd /c del %0 и файл самоуничтожится.

start cmd запустит новое окно cmd (отсоединенное от вашего основного процесса). /c указывает окнам выполнять все, что идет после /c в строке. Затем del удалит файл по указанному пути. Параметр $0 относится к первому аргументу командной строки, который обычно является именем и путем к файлу, который был выполнен, что мы и хотим. (параметр $0 - это путь к файлу, вы хотите передать его команде del).

0 голосов
/ 02 октября 2016

Я решил эту проблему (используя Visual Basic), создав пакетный файл, который выполняется, пока процесс еще выполняется, ждет 1 сек, чтобы программа могла закрыться, а затем удаляет программу.

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

 Sub del()
    Dim file As System.IO.StreamWriter
    file = My.Computer.FileSystem.OpenTextFileWriter("del.bat", True)
    file.WriteLine("")
    file.WriteLine("timeout 1")
    file.WriteLine("echo Y | del *.*")
    file.Close()
    Process.Start("del.bat")
    Me.Close()
End Sub
0 голосов
/ 22 октября 2009

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

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