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

oli*_*ren 9 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
Run Code Online (Sandbox Code Playgroud)

码:

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"));
    }
}
Run Code Online (Sandbox Code Playgroud)

aio*_*obe 17

Java 7及以上版本

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

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

Java 6及以下版本

来自以下文件File.renameTo:

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

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

您也可以尝试使用FileUtils.moveFileApache Commons中的方法.


JB *_*zet 6

Javadoc救援:

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

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