Can';t删除目录I'中的文件;你用Java重命名了吗?

Can';t删除目录I'中的文件;你用Java重命名了吗?,java,file,file-rename,delete-file,Java,File,File Rename,Delete File,今天我在玩弄java.io.File方法,偶然发现了一些奇怪的东西 当我重命名一个目录时,我似乎永远无法删除文件或新目录 File dir = new File("dir"); dir.mkdir(); File file = new File(dir, "afile.txt"); file.createNewFile(); File newname = new File(dir, "newName.txt"); file.renameTo(n

今天我在玩弄java.io.File方法,偶然发现了一些奇怪的东西

当我重命名一个目录时,我似乎永远无法删除文件或新目录

    File dir = new File("dir");
    dir.mkdir();

    File file = new File(dir, "afile.txt");
    file.createNewFile();

    File newname = new File(dir, "newName.txt");
    file.renameTo(newname);

    File newdir = new File("newdir");
    dir.renameTo(newdir);

    System.out.println("file exists? " + file.exists());
    System.out.println("file deleted? " + file.delete());
    System.out.println("newname exists? " + newname.exists());
    System.out.println("deleted newname? " + newname.delete());
    System.out.println("dir exists? " + dir.exists());
    System.out.println("dir deleted? " + dir.delete());
    System.out.println("newdir exists? " + newdir.exists());
    System.out.println("deleted newdir? " + newdir.delete());
产生输出:

    file exists? false
    file deleted? false
    newname exists? false
    deleted newname? false
    dir exists? false
    dir deleted? false
    newdir exists? true
    deleted newdir? false
但是,在文件系统中,newdir和newname.txt仍然存在

但是,如果我注释掉目录的重命名,删除操作就可以了


在delete()和rename()之间是否有其他需要了解的规则?javadoc中没有太多内容。

如果JVM没有关闭底层文件通道,您将无法从资源管理器中删除文件,因为它们仍将被标记为锁定。

我认为输出没有任何问题:

    file exists? false
    file deleted? false
    newname exists? false
    deleted newname? false
    dir exists? false
    dir deleted? false
    newdir exists? true
    deleted newdir? false
  • 重命名结束时,仅存在
    newdir/
    newdir/newName.txt
    。因此,输出的前六行应该是
    false
    ,它们是。(特别是,
    newname
    变量仍然引用不再存在的
    dir/newname.txt
    。)

  • newdir
    确实存在;您的输出证实了这一点

  • 因为目录不是空的,所以final不起作用


  • 总之,一切似乎都像人们期望的那样工作。

    正如Aix在其评论中所说:它试图删除
    dir/newName.txt
    ,而这已经不存在了,因为您将其重命名为
    newdir/newName.txt
    ,为什么我不能删除newName.txt,尽管?@jonnyfive:因为它试图删除
    dir/newName.txt
    ,而该文件已不存在(您已将其重命名为
    newdir/newName.txt
    )。关于java.io.File的实例,您需要记住两件事。1) 它们表示路径名而不是文件2)它们是不可变的。这就解释了你为什么要观察这种行为。