当生成的文件位于另一个文件系统上时,Java无法移动(重命名)文件

时间:2012-05-10 09:59:46

标签: java linux filesystems

我们在尝试将文件从一个目录移动到另一个目录时出错的程序。经过多次调试后,我通过编写一个只将一个文件从一个目录移动到另一个目录的小实用程序来找到错误(下面的代码)。事实证明,在本地文件系统上移动文件时工作正常,尝试将文件移动到另一个文件系统失败。

这是为什么?问题可能是特定于平台的 - 如果重要的话,我们在ext3上运行Linux。

第二个问题;我应该使用除renameTo()类的File方法以外的其他方法吗?似乎这只适用于本地文件系统。

测试(以root身份运行):

touch /tmp/test/afile

java FileMover /tmp/test/afile /root/
The file move was successful

touch /tmp/test/afile

java FileMover /tmp/test/afile /some_other_disk/
The file move was erroneous

代码:

import java.io.File;

public class FileMover {
    public static void main(String arguments[] ) throws Exception {
        boolean success;
        File file = new File(arguments[0]);
        File destinationDir = new File(arguments[1]);
        File destinationFile = new File(destinationDir,file.getName() );
        success = file.renameTo(destinationFile);
        System.out.println("The file move was " + (success?"successful":"erroneous"));
    }
}

4 个答案:

答案 0 :(得分:17)

Java 7及以上

使用Files.move(Path source, Path target, CopyOption... opts)

请注意,在文件系统之间移动文件时,不得提供ATOMIC_MOVE选项。

Java 6及以下

来自File.renameTo的文档:

  

[...] 重命名操作可能无法将文件从一个文件系统移动到另一个文件系统 [...]

明显的解决方法是通过打开新文件“手动”复制文件,将内容写入文件,然后删除旧文件。

您也可以尝试使用Apache Commons的FileUtils.moveFile方法。

答案 1 :(得分:6)

Javadoc救援:

  

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

     

请注意,Files类定义了移动或重命名a的移动方法   以独立于平台的方式提交文件。

答案 2 :(得分:1)

来自文档:

  

重命名此抽象路径名表示的文件。

     

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

如果要在不同文件系统之间移动文件,可以使用Apache的moveFile

答案 3 :(得分:-1)

你的思想是错误的 beause / some_other_disk /是相对url但完全是url,找不到url 我有例子

java FileMover D:\ Eclipse33_workspace_j2ee \ test \ src \ a \ a.txt D:\ Eclipse33_workspace_j2ee \ test \ src 文件移动成功

java FileMover D:\ Eclipse33_workspace_j2ee \ test \ src \ a \ a.txt \ Eclipse33_workspace_j2ee \ test \ src

文件移动是错误的

结果是网址错误