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

时间:2011-12-26 09:17:20

标签: java

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

类似这样的事情

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

// delete file

5 个答案:

答案 0 :(得分:4)

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

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

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

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

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

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

    另一方面,如果某个其他进程打开了该文件,那么您也可以尝试删除该文件而不进行测试以查看它是否已打开。如果删除成功,则成功。否则,检测到失败并执行您在检测到文件已打开时所做的任何事情。

答案 1 :(得分:1)

您可以找到答案check if a file is already open,因为您的问题是该问题的复制品

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

您可以尝试锁定该文件,如果该文件没有被其他人打开,您将不会收到异常,否则您将收到异常,因此编写类似这样的函数可以检查文件是否已经存在由其他人打开:

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
}

答案 4 :(得分:0)

你好@chinchu和@Subash,

你不能直接检查,没有任何API可以做,你必须为它编写代码

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

        File file1 = new File("<file path>");
        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