【问题标题】:Problems deleting a file with Java (apache commons io)使用 Java 删除文件时出现问题(apache commons io)
【发布时间】:2011-08-24 02:00:44
【问题描述】:

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

我为此使用 Apache commons.io (FileUtils.forceDelete(File file))。当我执行时,我得到一个 IOException:

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

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

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

谢谢,马可

【问题讨论】:

  • 您确定该文件没有被其他进程使用吗?尝试手动重命名/删除此文件。
  • 根据 Apache SVN,在异常发生之前调用 File 对象上的方法 delete()。这意味着无法按要求删除指定的文件。我的猜测是,文件上仍然存在锁。
  • 知道如何解除锁定吗?
  • 如果不了解生成文件的代码,就很难提出解决方案。根据创建文件所使用的模式,您可以不理会它们,方法是替换文件本身。另一个来源可能是使用 IDE 来运行应用程序。有时 IDE 的锁定文件,即使它们与它无关。如果可能,您也可以尝试删除整个目录,但这可能会产生与删除文件相同的结果。
  • 您是否使用任何阅读器来访问该文件?您可能想关闭阅读器或使用 try-with-resources 实现阅读过程。

标签: java io apache-commons apache-commons-io


【解决方案1】:

几乎可以肯定它被另一个进程锁定了。如果它是在操作系统级别锁定的另一个进程(假设您让文件在文本编辑器中打开它),那么您将不会有太多运气。如果其他东西锁定了文件,即使是 Windows 资源管理器也可能无法删除文件。不过,请查看 java.nio.channels.FileLock 以了解相关 API 调用。

【讨论】:

    【解决方案2】:

    很可能,另一个进程保持file.log 处于打开状态,这会阻止它被删除。

    【讨论】: