我正在尝试使用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();
}
}
答案 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中打开安装目录,因此无法删除该安装目录,从而使其无法进行删除,重命名或其他文件操作。