java file.renameTo()重命名文件但返回false。 为什么?

问题是我需要在我的逻辑的其余部分工作之前移动文件,所以当方法返回false时我停止执行。

但是,当我在Windows资源管理器中检查文件时,它有一个新名称,并且它已移动。

只是好奇为什么会这样。

这里是一些示例代码,我只是试图重新创建该问题。 它几乎是一样的,它工作正常。

File testfile = new File("TestFile"); if(!testfile.exists()){ testfile.mkdirs(); } File sample = new File("sample.txt"); if(sample.exists()){ boolean success = sample.renameTo(new File(testfile.getPath() + "\\" + sample.getName())); if(success){ System.out.println("Moved"); } else{ System.out.println("Failed"); } } 

编辑:解决了它。 我很遗憾浪费每个人的时间来愚蠢的事情。 但是,我真的不认为如果不发表这篇文章,我会追踪到这一点。

解决方案是我实际上循环遍历几个文件来移动。 当输出说失败然后程序停止了,当我查看资源管理器时,只有第一个文件被实际移动,所以我认为它正在移动然后返回false。 然而,问题在于我使用了错误的变量作为索引,所以发生的事情是它确实成功地在索引0中移动了文件,然后当循环重复时索引没有增加,所以它试图再次移动索引0因此失败了。

就像我说的那样,非常愚蠢,但感谢与我的关系。

Java的File.renameTo()是有问题的,特别是在Windows上,似乎。 正如API文档所说:

此方法行为的许多方面本质上都依赖于平台:重命名操作可能无法将文件从一个文件系统移动到另一个文件系统,它可能不是primefaces的,如果具有目标抽象路径名的文件,它可能不会成功已经存在。 应始终检查返回值以确保重命名操作成功。

您可以使用apache.commons.io库,其中包括FileUtils.moveFile()或JDK 7中的Files.move()方法。

你的文件是否有可能在某处打开但尚未关闭,因此重命名不起作用。 在关闭之前尝试关闭与文件对象相关的所有打开的流。

这个对我有用

 File file = new File("E:/Javadocs/" , "new.txt"); File file1 = new File("E:/Javadocs/" , "myDoc.txt"); file1.createNewFile(); if (file1.exists()){ System.out.println(file1.renameTo(file)); } 

这将创建一个文件myDoc.txt并将其重命名为new.txt并将打印为true
我也尝试使用File(URI)构造函数,它工作正常