无法关闭并删除已打开的.xls文件thro' java代码

时间:2017-02-01 05:22:28

标签: java file

我试图通过java代码删除目录, 现在 用例是: 如果文件已经打开,那么它应该先关闭它,然后我可以直接删除该目录。

我试图使用FileoutputStream关闭文件但是我无法使FileoutputStream的对象显示错误 "进程无法访问该文件,因为它正被另一个进程使用"

有另一种方法可以帮助我吗?

1 个答案:

答案 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 文件及其所在的文件夹,因为它已不再使用。