使用Java (Apache Commons IO)删除文件时遇到的问题

14

我通过JNI调用一个C++方法,它会在给定的目录中创建两个文件:一个文本日志文件和一个PDF文件。我想在执行JNI方法之前删除这些文件(如果它们存在)。

我使用Apache commons.io(FileUtils.forceDelete(File file))来实现。但是执行时我遇到了一个IOException:

java.io.IOException: Unable to delete file: D:\Folder\file.log

在调用delete方法之前,我使用File.canWrite()方法检查文件的可写状态。对于文件和父目录,它都返回true。

你有什么想法为什么我删除文件时会遇到问题吗?据我所知,创建文件的C++方法在方法完成后关闭或解锁它们。无论如何,我无法访问C++代码的源代码,因此无法检查是否确实如此或修改代码。

谢谢,Marco


你确定这个文件没有被其他进程占用吗?试着手动重命名/删除这个文件。 - ahmet alp balkan
根据Apache SVN的说法,在异常发生之前,File对象上的delete()方法被调用。这意味着无法按要求删除指定的文件。我的猜测是,该文件仍然存在锁定。 - Osiris76
1
有什么办法可以去掉锁定吗? - user212926
没有了解生成文件的代码知识,很难提供解决方案。根据创建文件时使用的模式,您可以将它们保持不变,并且该方法会自动替换文件。另一个来源可能是使用IDE运行应用程序。有时候IDE会锁定文件,即使它们与之无关。如果可能的话,您也可以尝试删除整个目录,但这可能会产生与删除文件相同的结果。 - Osiris76
你是否在使用任何阅读器来访问文件?你可能需要关闭阅读器或使用 try-with-resources 实现读取过程。 - Kersy
2个回答

10

这个文件几乎肯定被另一个进程锁定了。如果是在操作系统层面上有其他进程锁定(比如你在文本编辑器中打开了这个文件),那么你将很难成功删除它。即使是Windows资源管理器也可能无法删除锁定的文件。然而,可以查看相关 API 调用的 java.nio.channels.FileLock


2
很可能有另一个进程正在使用 file.log,这将阻止它被删除。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接