【问题标题】:Delete directory after moving files from it [Java]从中移动文件后删除目录[Java]
【发布时间】:2021-03-07 18:03:08
【问题描述】:

我有一个目录 M:\SOURCE我已经列出并移动了它的内容,直到它为空

在那之后,我想继续删除它,我试过了(是的,我也确保它是空的):

sourceFile being "M:\SOURCE"

sourceFile.delete()
Files.delete(sourceFile.toPath());
FileUtils.deleteQuietly(sourceFile);
FileUtils.deleteDirectory(sourceFile);
FileUtils.forceDelete(sourceFile)

没有任何其他方法抛出异常,并且 .delete() 返回 true 但是,该目录仍然存在,在尝试访问该文件夹时我从 Windows 收到以下消息:

运行进程资源管理器时我可以看到 java 正在使用该资源(只有在我尝试删除源时才会发生这种情况,请记住尝试删除源目录是我的程序做的最后一件事)

为了让我更加害怕,一旦我停止了我的 java 虚拟机,文件夹就会神奇地消失。所以Java确实得到了正确的指令,只是在它被终止之前不愿意删除它

在删除目录之前运行System.gc()也没有帮助,我的工作目录不是我要删除的目录

【问题讨论】:

  • 您的文件夹中是否有任何文件在您的 java 程序中被删除?如果您进行了一些 I/O 操作,那么这些文件可能会挂在您的 JVM 内存中。你需要关闭它们/它。
  • L.E.你如何移动内容?可以分享代码吗?
  • 其中一些方法返回结果值......您应该检查这些值。另外,我认为您应该使用 NIO API 而不是 Apache Commons。

标签: java file directory nio


【解决方案1】:

在删除目录之前使用Files NIO 调用列出或返回目录内容流时会出现此问题。

对 Files NIO 返回的任何路径流上的资源使用 try 可以帮助防止此问题:

try(Stream<Path> stream = Files.list(directory)) {
    // do any work on contents - move / delete
}
// delete directory after closing stream above

【讨论】:

  • 不幸的是,我已经确保这样做了。我有一个流,我变成 List 然后我立即关闭它;为了迭代列表以避免此类问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-30
  • 2013-01-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多