爪哇 | 尝试删除 Windows 计算机上的文件会导致“幻像文件”

Twi*_*OLT 7 java windows io fileutils

我正在尝试使用 apache commons-io 的 FileUtils.deleteDirectory 方法删除 Windows 计算机上的一些文件(commons 库的版本是 2.4)。所述方法最终调用“forceDelete”FileUtils方法,该方法在第2273行调用“file.delete()”:

2268  public static void forceDelete(File file) throws IOException {
2269      if (file.isDirectory()) {
2270          deleteDirectory(file);
2271      } else {
2272          boolean filePresent = file.exists();
2273          if (!file.delete()) {
2274              if (!filePresent){
2275                  throw new FileNotFoundException("File does not exist: " + file);
2276              }
2277             String message =
2278                   "Unable to delete file: " + file;
2279                throw new IOException(message);
2280        }
2281     }
2282 }
Run Code Online (Sandbox Code Playgroud)

现在, file.delete 为有问题的文件调用 FileSystem.delete(this) ,这是我不确定会发生什么的部分。如果文件被删除,FileSystem.delete 应该返回 true;如果存在某种问题并且文件未被删除,则返回 false。当尝试删除文件时,该方法返回“true”,但文件仍保留在目录中,并且由于目录未正确清空,因此稍后无法在 FileUtils.deleteDirectory 方法中删除它,从而引发异常。

该文件可以随时从 Windows 文件资源管理器中手动删除,直到调用 fileSystem.delete(this) 方法为止。一旦调用该方法,文件就无法被文件资源管理器删除,并在应用程序关闭时消失

我多次提到Windows的原因是因为这个问题在Linux机器上不会发生。

这最终引出了我的问题:“有人知道这个问题的原因是什么,或者至少提供一些关于如何获得答案的见解吗?”

这是我的第一篇文章,如果我做错了什么,我很抱歉,提前致谢。

VGR*_*VGR 2

java.io.File 是一个非常古老的类。它是 20 世纪 90 年代 Java\xe2\x80\x99s 第一个版本的一部分。当时面向对象的设计还没有被很好地理解,File 类在 API 设计和实现方面都存在许多缺陷。

\n

它的现代替代品是java.nio.file包,特别是用于表示文件名的Path类,以及用于执行文件操作的Files类(注意 \xe2\x80\x98s\xe2\x80\x99)。

\n

使用 java.nio.file 的相同功能可能如下所示:

\n
public static void forceDelete(File file) throws IOException {\n    Files.walkFileTree(file.toPath(), new SimpleFileVisitor<Path>() {\n        @Override\n        public FileVisitResult visitFile(Path file,\n                                         BasicFileAttributes attrs)\n        throws IOException {\n            Files.delete(file);\n            return super.visitFile(file, attrs);\n        }\n\n        @Override\n        public FileVisitResult postVisitDirectory(Path dir,\n                                                  IOException e)\n        throws IOException {\n            Files.delete(dir);\n            return super.postVisitDirectory(dir, e);\n        }\n    });\n}\n
Run Code Online (Sandbox Code Playgroud)\n

旧的 File.delete() 不会抛出异常;它只是返回一个布尔值,你无法知道操作失败的原因。java.nio.file 包修复了这个问题;如果操作失败,您将收到一个信息丰富的异常。因此,上述实现可能无法解决问题,但至少您可以清楚地了解发生了什么。

\n