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机器上不会发生。
这最终引出了我的问题:“有人知道这个问题的原因是什么,或者至少提供一些关于如何获得答案的见解吗?”
这是我的第一篇文章,如果我做错了什么,我很抱歉,提前致谢。
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 的相同功能可能如下所示:
\npublic 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}\nRun Code Online (Sandbox Code Playgroud)\n旧的 File.delete() 不会抛出异常;它只是返回一个布尔值,你无法知道操作失败的原因。java.nio.file 包修复了这个问题;如果操作失败,您将收到一个信息丰富的异常。因此,上述实现可能无法解决问题,但至少您可以清楚地了解发生了什么。
\n| 归档时间: |
|
| 查看次数: |
380 次 |
| 最近记录: |