Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
当生成的文件位于另一个文件系统上时,Java无法移动(重命名)文件_Java_Linux_Filesystems - Fatal编程技术网

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

当生成的文件位于另一个文件系统上时,Java无法移动(重命名)文件,java,linux,filesystems,Java,Linux,Filesystems,我们试图将文件从一个目录移动到另一个目录时出错的程序。经过多次调试后,我通过编写一个小实用程序来定位错误,该程序只需将文件从一个目录移动到另一个目录(下面的代码)。事实证明,当在本地文件系统上移动文件时,尝试将文件移动到另一个文件系统是失败的 为什么会这样?问题可能是特定于平台的——如果有必要的话,我们正在ext3上运行Linux 第二个问题;我是否应该使用文件类的重命名()方法以外的其他方法?这似乎只适用于本地文件系统 测试(以root用户身份运行): 代码: Java 7及以上版本 使用 请

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

为什么会这样?问题可能是特定于平台的——如果有必要的话,我们正在ext3上运行Linux

第二个问题;我是否应该使用
文件
类的
重命名()方法以外的其他方法?这似乎只适用于本地文件系统

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

代码:

Java 7及以上版本 使用

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

Java 6及以下版本 从以下文件:

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

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

您也可以从Apache Commons中尝试该方法。

为了拯救:

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

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

从文档中:

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

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

如果您想在不同的文件系统之间移动文件,可以使用Apache的ider is error 因为/some\u other\u disk/是相对url但完全url,找不到url 我举了个例子

java FileMover D:\Eclipse33\u workspace\u j2ee\test\src\a\a.txt D:\Eclipse33\u workspace\u j2ee\test\src 文件移动成功

java FileMover D:\Eclipse33\u workspace\u j2ee\test\src\a\a.txt\Eclipse33\u workspace\u j2ee\test\src

文件移动是有害的


结果是url是错误的

Errr。。。在我编写我的时没有加载你的答案:),moveFile是救世主+1你对Apache Commons的建议正是我的下一步。感谢您提供了一个信息丰富的答案,实际上回答了这两个问题!为了补充上面已经提供的优秀答案,如果oldpath和newpath不在同一个挂载的文件系统上,重命名中使用的系统调用将返回EXDEV。事实上,像“mv”这样的程序通过执行显式复制,然后执行删除操作来处理这种情况。任何以“/”开头的路径都是绝对路径(在Unice上)。所以不,请看上面的答案,这是真正回答问题的答案。
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"));
    }
}