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



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

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

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

测试(以根用户身份运行):

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"));
    }
}

Java 7 及更高

版本

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

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

Java 6 及更低版本

来自File.renameTo的文档:

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

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

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

Javadoc 来救援:

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

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

从文档中:

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

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

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

您的 ider 是错误的beause/some_other_disk/是相对网址但完全网址,找不到网址我有例子

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

文件移动错误

结果是网址是错误

最新更新