Как сделать, чтобы программа могла сама себя удалить и папку где находится?

Мне нужно, чтобы по параметру -uninstall программа удалялась через cmd. Параметр программа видит. Но вот удаление не происходит. Я написал сначала Directory.Delete("Местоположение папки").Она удалила все xml файлы, но оставила .dll и .exe файлы. Может кто подсказать как сделать, чтобы программа могла удалить сама себя?


Ответы (1 шт):

Автор решения: Vyacheslav Nizhegorodtsev

попробуйте что-нибудь в этом роде:

    static void Main(string[] args)
    {
        if (args.Contains("-uninstall"))
        {
            AppDomain.CurrentDomain.ProcessExit += CurrentDomain_ProcessExit;
            return;
        }

        Console.WriteLine("Other job done! Press any button to exit...");
        Console.ReadKey();
    }

    private static void CurrentDomain_ProcessExit(object sender, EventArgs e)
        => DeleteYourself();

    static void DeleteYourself()
    {
        // Тут получим текущую папку в которой лежит наш .exe файл. Возможны разные сценарии,
        // возможно вам нужно будет удалять и каталоги выше по иерархии.
        var currentDirectory = Environment.CurrentDirectory;

        // Создадим экземпляр процесса, который в cmd выполнит команду удаления этой папки
        System.Diagnostics.Process process = new System.Diagnostics.Process() {
            StartInfo = new System.Diagnostics.ProcessStartInfo() {
                WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden,
                FileName = "cmd.exe",
                WorkingDirectory = Environment.GetFolderPath(Environment.SpecialFolder.System), // Зададим рабочий каталог, потому что если этого не сделать, сама папка с нашим .exe останется заблокированной и мы не сможем ее удалить.
                Arguments = $"/C timeout 1 & rmdir \"{currentDirectory}\" /s /q"
                // /C - говорит cmd.exe что мы передаем в нее стркоу с командой, а не просто запускаем (как у вас передается -uninstall)
                // timeout 1 - ждет 1 секунд перед выполнением следующей операции, за это время наше приложение должно завершиться и не блокировать .exe (возможно может понадобиться больше времени)
                // & - символ для объединения операций, чтоб передать их в cmd одной строкой
                // rmdir - удаляет указаный каталог (/s - удалит все файлы и все доечерние каталоги, /q - сделает это тихо и не задаст лишних вопросов)
            }
        };

        // И запускаем его
        process.Start();
    }
→ Ссылка