我试图通过java代码删除目录, 现在 用例是: 如果文件已经打开,那么它应该先关闭它,然后我可以直接删除该目录。
我试图使用FileoutputStream关闭文件但是我无法使FileoutputStream的对象显示错误 "进程无法访问该文件,因为它正被另一个进程使用"
有另一种方法可以帮助我吗?
答案 0 :(得分:2)
如果您要删除的文件已由Java应用程序打开,可能使用 Runtime.getRuntime()。exec()方法或通过任何其他方式,那么该文件必须是在执行任务之前关闭。当然,由于文件是打开的,您无法删除该文件的主文件夹(目录),因此需要先关闭该文件。这是一个完全有道理的操作系统安全措施,为什么我们要删除其他东西正在使用的东西呢?
要关闭文件,您需要知道正在使用它的进程的名称,例如,如果已使用 MS Windows打开名为 MyText.txt 的文本文件NotePad.exe 然后您必须关闭 NotePad.exe 进程,该进程将文件 MyText.txt 打开。
下面我提供一个简单的方法,可以为您提供正确的流程名称,从而关闭一个开放的外部流程。从上面的示例中可以看出“Notepad.exe”
public static void killProcess(String processName) {
// PLEASE NOTE: This method will currently Kill "ALL"
// open processes of the supplied process
// name unless commented code changes are
// made.
try {
Runtime rt = Runtime.getRuntime();
// For Windows OS...
if (System.getProperty("os.name").toLowerCase().contains("windows")) {
rt.exec("taskkill /T /F /IM " + processName);
//rt.exec("taskkill /T /F /PID " + Long.parseLong(processName)); // Supply the PID value as string
//rt.exec("taskkill /F /FI \"WINDOWTITLE eq " + processName + "\" /T"); // Supply the window title bar text.
// If you want to kill only a single instance of the
// named process then get its PID value and use:
// "taskkill /T /F /PID PID_Value" OR you can provide
// the window title and use:
// "taskkill /F /FI \"WINDOWTITLE eq " + processName + "\" /T"
}
// For OSX And Linux OS's...
else {
rt.exec("sudo killall -9 '" + processName + "'");
//rt.exec("kill -9 " + Long.parseLong(processName)); // Supply the PID value as string
// If you want to kill only a single instance of the
// named process then get its PID value and use:
// "kill -9 PID_Value"
}
rt.freeMemory();
}
catch (IOException | SecurityException | IllegalArgumentException ex) {
ex.printStackTrace();
}
}
正如此方法代码开头的注释所述, ALL 当前正在运行的所提供进程名称的进程将被终止。如果您只想终止某个进程的特定实例,例如上面的示例,并且您有另外四个Notepad.exe实例打开编辑其他文本文件,那么您需要将方法代码更改为:
rt.exec("taskkill /F /FI \"WINDOWTITLE eq " + processName + "\" /T");
而不是:
rt.exec("taskkill /T /F /IM " + processName);
当然你可以这样称呼这个方法:
killProcess("MyText.txt - Notepad");
您提供应用程序窗口标题栏中的内容。完成上述方法后,您可以删除 MyText.txt 文件及其所在的文件夹,因为它已不再使用。