Как инсталлер удаляет сам себя?

Дядя Корней

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

Дядя Корней

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


Дядя Корней

Yury Komar, не, как удалить файлы это не вопрос, тут всё понятно. Для меня сейчас не понятно как запущенное ехе удаляет само себя? Вот этого я действительно не пойму.


Дядя Корней

Дядя Корней, ну я делал как-то на закрытие формы создание в этой же папке BAT файла, который в цикле пытается удалть файл exe, и как только он закрылся (тоесть доступ к нему открыт) удаляет его и затем удаляет сам себя, а как известно БАТНИК выполняется в памяти, и доступ к самому файлу не блокирует. Могу предложить пример, пороюсь щас в закромах у себя, покажу свой вариант.Но я знаю точно - есть и другие варианты... но для этого нужно завершить процесс файла ЕХЕ, без этого никак - это однозначно.
как запущенное ехе удаляет само себя?
как и обещал, ответ на ваш вопрос с использованием BAT файла:
    Public Sub DelSelf(Optional [BatFileName] As String = "DelSelf.bat")
        Dim BatFilePath As String = Application.StartupPath & "" & [BatFileName]
        Dim BatFile As String = String.Format("@echo off" & vbCrLf &
                                              ":try" & vbCrLf &
                                              "del ""{0}""" & vbCrLf &
                                              "if exist ""{0}"" goto try" & vbCrLf &
                                              "del ""{1}""",
                                              Application.ExecutablePath, BatFilePath)
        IO.File.WriteAllText(BatFilePath, BatFile, System.Text.Encoding.Default)
        Process.Start(BatFilePath)
    End Sub
запускать можно где угодно, но целесообразнее конечно на выходе из приложения:
    Private Sub Form1_FormClosed(sender As Object, e As FormClosedEventArgs) Handles MyBase.FormClosed
            Call DelSelf()
    End Sub
Дядя Корней, А вот кстати и вариант покороче, но удаление занимает примерно 1 секунду после закрытия приложения, в отличии от первого моего варианта, который удаляет практически моментально.
'Вместо нуля в аргументах указать количество секунд задержки перед удалением файла
Shell("cmd.exe /C choice /C Y /N /D Y /T 0 & Del " & Chr(34) & Application.ExecutablePath & Chr(34), vbHide)


Дядя Корней

а как инсталлер удаляет сам себя?
А по-моему, инсталлеры сами себя не удаляют. Например, в Windows всю работу выполняет процесс msiexec.exe.


Дядя Корней

Убежденный, я думаю Дядя Корней все-таки хотел узнать как приложение может удалить само себя, ведь в .NET нет своей такой функции вроде, но примером был инсталлятор, для большего понимания вопроса...Убежденный, ключевая фраза была
Как повторить такое же
Как я конечно понял, хотя, могу и ошибаться...


Дядя Корней

А по-моему, инсталлеры сами себя не удаляют. Например, в Windows всю работу выполняет процесс msiexec.exe.
я думаю Дядя Корней все-таки хотел узнать как приложение может удалить само себя
В случае с NSIS, InnoSetup и иже с ними установщик Windows может вообще никак не задействоваться, а деинсталляторы вышеобозначенных инсталляционных систем отнюдь не всегда удаляют сами себя, оставляя после себя мусор в папке %TEMP%. Удаляют сами себя, как правило, различные дроперы или загрузчики сплойт-паков. Что до реализации самоудаления... Yuri Komar забыл упомянуть, что с choice трюк не прокатит на ХР (которая все еще некоторыми используется). С таким же успехом - теоретически - можно использовать тип ProcessStartInfo, указав в качесте запускаемой программы cmd.exe, а аргументов что-то вроде "del /f /q " & Path.GetFullPath(Environment.GetCommandLineArgs()(0)); окно сделать скрытым. Однако, идеологически правильным было бы использовать WinAPI.


Дядя Корней

идеологически правильным было бы использовать WinAPI
приведите пример, хочется посмотретьgreg zakharov, но вариант с батником работет отлично и в WinXP


Дядя Корней

Yury Komar, конечно с батом в ХР все будет работать пучком. Единственный минус такого подхода - временый файл.


Дядя Корней

конечно с батом в ХР все будет работать пучком. Единственный минус такого подхода - временый файл
от ведь удаляется сразу после удаления EXEшника, следовательно - и следов не оставит.