2009-10-22 3 views
21

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

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

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

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

+1

Я узнал, что наиболее подходит мне в статье http://www.catch22.net/tuts/selfdel. – ata

ответ

2

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

+3

, а затем, что удаляет приложение, которое удаляет другое приложение? – PAULDAWG

16

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

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

+1

Я не понимаю, почему мы не можем удалить его, потому что exe загружается в ОЗУ, поэтому зачем ему связываться с жестким диском? – Xinus

+10

В Windows загружается столько исполняемого файла, сколько требуется, поэтому он не (а) не использует слишком много ОЗУ или (b) должен снова записать исполняемый файл в файл подкачки, если не хватает ОЗУ , Вы можете думать, что каждый исполняемый файл запускается Windows как временный файл подкачки только для чтения. Если страница ОЗУ должна быть отброшена, Windows может просто отказаться от нее, зная, что она всегда может быть перезагружена из EXE-файла, когда это необходимо. –

+0

Этот метод слишком полагается на перезапуск. Без сомнения, это сработает, но я хотел бы удалить файл, как только смогу. – ata

0

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

4

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

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

+0

Конечно, эта функция (наряду с такими вещами, как скрытые/системные файлы и т. Д.) Также сохранила множество пользовательских данных (и самой системы), когда пользователь ошибочно выполняет эквивалент 'rm -rf /'. Это немного нервирует меня, как системы Unix не склонны бить ресницы и просто избавляются от * всего *. Если вы считаете, что вам нужно быть действительно глупым, чтобы сделать это, просто посмотрите, сколько скриптов/приложений оболочки nix вы можете использовать для Google «XXX удалил все мои данные». Включение высокопрофильного программного обеспечения, такого как Steam: D Это не поможет вам указать '-rf' перед трактом -'/'/' \ 'довольно близко к' enter'. – Luaan

13
process.start("cmd /c ping localhost -n 3 > nul & del filepath") 
exit 

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

заменить FilePath с путем к вашему еху

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

+0

Если вы не используете XP, вы можете избежать обходного пути ping, передав «/ C choice/CY/N/DY/T 3» (сама команда cmd будет ждать 3 секунды): https: // www. codeproject.com/Articles/31454/How-To-Make-Your-Application-Delete-Itself-Immedia – maja

0

Я решил эту проблему (используя 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