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