在尝试删除文件之前检查文件是否已打开

在尝试以编程方式删除文件之前,如何检查文件是否已打开?

这样的事情

if (file is open){ // close it first } // delete file 

我不认为这会因为一些原因而起作用。

  1. 如果您已打开文件,则没有用于测试的标准Java机制。

  2. 即使有这样的机制,也很难找到文件的句柄,以便你可以关闭它。

  3. 即使您可以找到文件句柄,也存在潜在的竞争条件,其中一个线程测试文件并尝试删除它,第二个线程打开文件句柄。

  4. 这些都没有解决其他进程打开文件的情况。

如果您在删除应用程序已打开的文件时遇到问题,那么真正的问题很可能是您的应用程序正在泄漏文件描述符。 最好的解决方案是找到并修复泄漏…或确保使用“try / finally”或新的Java 7“try with resource”构造关闭所有文件流等。

另一方面,如果文件是由其他进程打开的,那么您也可以尝试删除该文件而不进行测试以查看它是否已打开。 如果删除成功,则成功。 否则,检测到故障并执行您检测到文件已打开时所执行的操作。

您可以在那里找到答案, 检查文件是否已打开,因为您的问题是该问题的复制品

基本上,如果需要确保它已关闭, 必须跟踪是否已打开文件。

请注意,在Unix系统上,删除打开的文件不是问题,并且可以正常工作。

您可以尝试锁定文件,如果文件未被其他人打开,您将不会获得exception,否则您将获得exception,因此编写类似这样的函数可以检查文件是否已被某人打开否则:

 public boolean isFileOpened(File file) boolean res = false; FileChannel channel = new RandomAccessFile(file, "rw").getChannel(); // Get an exclusive lock on the whole file FileLock lock = channel.lock(); try { //The file is not already opened lock = channel.tryLock(); } catch (OverlappingFileLockException e) { // File is open by someone else res = true; } finally { lock.release(); } return res; } 

然后,您可以使用该方法检查文件是否已以这种方式打开:

 if(isFileOpened(someFile)) { //Do Something } 

您好@chinchu和@Subash,

您无法直接检查,没有任何API可以执行此操作,您必须为其编写代码

以下是您可以根据自己的要求修改的代码段:

  File file1 = new File(""); boolean isDeleteSuccess; do { //delete the file isDeleteSuccess = file1.delete(); if (isDeleteSuccess) System.out.println(file1.getName() + " is deleted!"); else { //if not deleted then wait for 10 seconds for file to be closed System.out.println("Delete operation is failed."); Thread.sleep(10000); } } while (!isDeleteSuccess);//if not deleted then try again