今天我正在乱搞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中没有多少。
答案 0 :(得分:6)
我没有看到输出有任何问题:
在重命名结束时,仅存在 newdir/
和newdir/newName.txt
。因此,前六行输出应该是false
,它们是。{1}}。 (特别是,newname
变量仍然引用dir/newName.txt
,它不再存在。)
newdir
确实存在;你的输出证实了这一点。
最终delete()
不起作用,因为该目录不为空。
总之,一切看起来都与人们期望的完全一致。
答案 1 :(得分:1)
正如Aix在评论中所说的那样:它会尝试删除dir/newName.txt
,而这种情况不再存在,因为您将其重命名为newdir/newName.txt
。
答案 2 :(得分:0)
如果JVM尚未关闭基础文件通道,您将无法从资源管理器中删除这些文件,因为它们仍会被标记为已锁定。