在尝试删除文件之前检查文件是否已打开
在尝试以编程方式删除文件之前,如何检查文件是否已打开?
这样的事情
if (file is open){ // close it first } // delete file
我不认为这会因为一些原因而起作用。
-
如果您已打开文件,则没有用于测试的标准Java机制。
-
即使有这样的机制,也很难找到文件的句柄,以便你可以关闭它。
-
即使您可以找到文件句柄,也存在潜在的竞争条件,其中一个线程测试文件并尝试删除它,第二个线程打开文件句柄。
-
这些都没有解决其他进程打开文件的情况。
如果您在删除应用程序已打开的文件时遇到问题,那么真正的问题很可能是您的应用程序正在泄漏文件描述符。 最好的解决方案是找到并修复泄漏…或确保使用“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