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

时间:2013-02-01 17:15:08

标签: java file-io

问题是我需要在其余逻辑运行之前移动文件,所以当方法返回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因此失败了。

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

3 个答案:

答案 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)构造函数,它工作正常