自定义卸载程序无法在Java中自毁

时间:2019-06-16 08:46:56

标签: java cmd

我正在尝试使用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 个答案:

答案 0 :(得分:1)

安装目录是在新cmd中仍打开的进程。您需要执行的操作是使用新打开的cmd cd到安装目录的父目录,然后可以将其删除。 请改用以下代码:

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中打开安装目录,因此无法删除该安装目录,从而使其无法进行删除,重命名或其他文件操作。