繁体   English   中英

无法通过Java代码关闭和删除已打开的.xls文件

[英]Not able to Close and delete already opened .xls file thro' java code

我正在尝试通过Java代码删除目录,现在的用例是:如果文件已经打开,则应首先将其关闭,然后我可以直接删除目录。

我试图使用FileoutputStream关闭文件,但无法创建FileoutputStream对象,它显示错误,例如“该进程无法访问该文件,因为该文件正在被另一个进程使用”

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

如果您要删除的文件已由Java应用程序使用Runtime.getRuntime()。exec()方法或任何其他方式打开,则必须先关闭该文件,然后才能执行任务。 当然,由于该文件已打开,因此您也无法删除该文件的主文件夹(目录),因此需要首先关闭该文件。 这是完全有意义的操作系统保护措施,为什么我们要删除其他人正在使用的内容?

为了关闭文件,您将需要知道正在使用该文件的进程的名称,例如,如果已使用MS Windows NotePad.exe打开了名为MyText.txt的文本文件,则必须关闭该文件 。使文件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();
    }
}

在此方法代码开头的注释状态中,将终止所有当前正在运行且具有提供的进程名称的进程。 如果您只想终止某个进程的特定实例,例如上面的示例,并且您有四个Notepad.exe实例可以打开来编辑其他文本文件,那么您需要将方法代码更改为:

rt.exec("taskkill /F /FI \"WINDOWTITLE eq " + processName + "\" /T");

代替这个:

rt.exec("taskkill /T /F /IM " + processName);

当然,您可以将此方法称为:

killProcess("MyText.txt - Notepad");

您在其中提供应用程序的窗口标题栏中的内容。 一旦上述方法完成,您就可以删除MyText.txt文件及其所在的文件夹,因为它不再被使用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM