11

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

为什么是这样?问题可能是特定于平台的——如果这很重要,我们正在 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

4 回答 4

19

Java 7 及以上

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

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

Java 6 及以下

来自以下文档File.renameTo

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

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

你也可以试试FileUtils.moveFileApache Commons 的方法。

于 2012-05-10T10:01:48.600 回答
6

Javadoc来救援:

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

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

于 2012-05-10T10:02:25.183 回答
1

从文档:

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

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

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

于 2012-05-10T10:08:24.670 回答
-1

你的 ider 是错误的,因为 /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

文件移动错误

结果是 url 错误

于 2012-05-10T10:27:32.460 回答