9

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

就像我说的,非常愚蠢,但感谢您对我的包容。

4

3 回答 3

18

JavaFile.renameTo()似乎存在问题,尤其是在 Windows 上。正如 API 文档所说:

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

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

于 2013-02-01T17:20:45.380 回答
1

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

于 2013-02-01T17:32:48.313 回答
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) 构造函数它工作正常

于 2016-06-25T13:50:20.540 回答