问题是我需要在其余逻辑运行之前移动文件,所以当方法返回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因此失败了。
就像我说的那样,非常愚蠢,但感谢与我的关系。
答案 0 :(得分:13)
Java的File.renameTo()
是有问题的,特别是在Windows上,似乎。正如API文档所说:
此方法行为的许多方面都是固有的 依赖于平台:重命名操作可能无法移动 从一个文件系统到另一个文件系统的文件,它可能不是原子的,它 如果文件具有目标抽象路径名,则可能不会成功 已经存在。应始终检查返回值以确保 重命名操作成功。
您可以使用apache.commons.io库,其中包含FileUtils.moveFile()
或JDK 7中的Files.move()
方法。
答案 1 :(得分:0)
你的文件是否有可能在某处打开但尚未关闭,因此重命名不起作用。在关闭之前尝试关闭与文件对象相关的所有打开的流。
答案 2 :(得分:0)
这个对我有用
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)构造函数,它工作正常