Пользовательский деинсталлятор не может самоуничтожиться в Java - PullRequest
1 голос
/ 16 июня 2019

Я пытаюсь сделать пользовательский деинсталлятор с помощью Java, который я могу превратить в консольное приложение с помощью Launch4J. То, что я пытаюсь достичь, это когда программа удаления завершится , он должен открыть командную строку, которая удалит его, а затем удалить папку установки. Тем не менее, я получаю только эту ошибку: The process cannot access the file because it is being used by another process, но я вижу, что деинсталлятор уже удален, а каталог установки - нет. Может быть, деинсталлятор все еще открыт в памяти, или что я могу сделать, чтобы решить эту проблему?


public static void main(String[] args) {
    String command;
    command = "\"";
    command += "echo Self Destruction Commenced.";
    command += "& del /f /q \"" + System.getProperty("user.dir") + "\\uninstaller.exe\"";
    command += "& rmdir /q /s \"" + System.getProperty("user.dir") + "\"";
    command += "& echo. & echo MyProgram successfully uninstalled...";
    command += "& set /p exitkey= \"Press [ENTER] key to finish...\" ";
    command += "\"";
    selfDestructProgram("start cmd.exe /c " + command);
}

private static void selfDestructProgram(String command) {
    ProcessBuilder processBuilder = new ProcessBuilder();
    processBuilder.command("cmd.exe", "/c", command);
    try {
        Process process = processBuilder.start();
        process.waitFor();
    } catch (Exception var3) {
        var3.printStackTrace();
    }
}

1 Ответ

1 голос
/ 16 июня 2019

Каталог установки - это процесс, который все еще открыт в новом cmd.То, что вам нужно сделать, это перейти к родительскому каталогу установочного каталога с помощью недавно открытого cmd, и тогда вы сможете удалить его.Вместо этого используйте приведенный ниже код:

public static void main(String[] args) {
    //get the path to the parent directory
    File workingDir = new File(System.getProperty("user.dir"));
    String parentDir = workingDir.getParent();

    String command;
    command = "\"";
    command += "echo Self Destruction Commenced.";
    command += "& del /f /q \"" + System.getProperty("user.dir") + "\\uninstaller.exe\"";
    command += "& rmdir /q /s \"" + System.getProperty("user.dir") + "\"";
    command += "& echo. & echo MyProgram successfully uninstalled...";
    command += "& set /p exitkey= \"Press [ENTER] key to finish...\" ";
    command += "\"";

    //first cd to this parent directory before deleting the child directory, which is the installtion directory.
    selfDestructProgram("cd /d " + parentDir + " & start cmd.exe /c " + command);
}

private static void selfDestructProgram(String command) {
    ProcessBuilder processBuilder = new ProcessBuilder();
    processBuilder.command("cmd.exe", "/c", command);
    try {
        Process process = processBuilder.start();
        process.waitFor();
    } catch (Exception var3) {
        var3.printStackTrace();
    }
}

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

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