无法删除我在Java中重命名的目录中的文件?

时间:2012-01-31 13:32:34

标签: 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(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中没有多少。

3 个答案:

答案 0 :(得分:6)

我没有看到输出有任何问题:

  1. 在重命名结束时,仅存在 newdir/newdir/newName.txt。因此,前六行输出应该是false,它们是。{1}}。 (特别是,newname变量仍然引用dir/newName.txt,它不再存在。

  2. newdir确实存在;你的输出证实了这一点。

  3. 最终delete()不起作用,因为该目录不为空。

  4. 总之,一切看起来都与人们期望的完全一致。

答案 1 :(得分:1)

正如Aix在评论中所说的那样:它会尝试删除dir/newName.txt,而这种情况不再存在,因为您将其重命名为newdir/newName.txt

答案 2 :(得分:0)

如果JVM尚未关闭基础文件通道,您将无法从资源管理器中删除这些文件,因为它们仍会被标记为已锁定。