代码之家  ›  专栏  ›  技术社区  ›  TwistedBOLT

Java |试图删除Windows计算机上的文件会导致“幻影文件”

  •  2
  • TwistedBOLT  · 技术社区  · 2 年前

    我正在尝试使用apache commons io的FileUtils删除windows机器上的一些文件。deleteDirectory方法(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 }
    

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

    可以随时从windows文件资源管理器手动删除该文件 直到 文件系统。delete(这个)方法被调用。一旦调用该方法,文件资源管理器和 应用程序关闭时消失 .

    我多次提到windows的原因是,这个问题在linux机器上不会发生。

    这最终让我想到了我的问题,“有人知道这个问题的原因是什么,或者至少对如何获得一些答案给出了一些见解吗?”

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

    0 回复  |  直到 2 年前
        1
  •  2
  •   VGR    2 年前

    JAVA伊奥。File是一个非常古老的类。这是Java在20世纪90年代首次发布的一部分。当时对面向对象的设计没有那么好的理解,文件类在API设计和实现中都有很多缺陷。

    它的现代替代品是 java.nio.file 包,尤其是 Path 用于表示文件名的类,以及 Files 类(注意–s–s–s)来执行文件操作。

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

    旧档案。delete()不会引发异常;它只返回一个布尔值,您无法知道操作失败的原因。爪哇。尼奥。修复此文件包;如果操作失败,您将得到一个信息异常。因此,上述实现可能无法解决问题,但至少您会对发生的情况有一个很好的了解。

    推荐文章