如何将文件重命名为另一个文件系统?

Posted

技术标签:

【中文标题】如何将文件重命名为另一个文件系统?【英文标题】:How to rename a file to another file system? 【发布时间】:2011-10-28 14:24:57 【问题描述】:

我在使用 renameTo() 时遇到了一个奇怪的问题。我不知道为什么我不能重命名为/mnt/desttest,但可以重命名为/home/kit.ho/desttest。但是,我已经将所有写入权限授予 /mnt/。返回值为假,没有具体原因。谁知道原因?

import java.io.File;
public class renameFile 
    public static void main(String[] args) 
        File sourceFile = new File("/home/kit.ho/test");  
        File targetFile1 = new File("/mnt/desttest");  
        System.out.println("source file is exist? " + sourceFile.exists() + ", source file => " + sourceFile);  
        System.out.println(targetFile1 + " is exist? " + targetFile1.exists());  
        System.out.println("rename to " + targetFile1 + " => " + sourceFile.renameTo(targetFile1));  
        System.out.println("source file is exist? " + sourceFile.exists() + ", source file => " + sourceFile);   
    

编辑: 最后,根据一些答案,重命名功能不适用于跨文件系统,是否可以通过不调用“mv”等外部命令来解决此问题?

【问题讨论】:

/mnt 是单独的分区吗? 你能mv /home/kit.ho/test /mnt/desttest没有问题吗? @Mechanical: 是的 /mnt 在单独的分区上。 我不想使用外部进程重命名文件 @Kit Ho:你没有重命名文件;您正在跨分区移动它。 【参考方案1】:

您不能跨文件系统(分区)进行重命名。

【讨论】:

@Kit Ho:您必须将所有内容复制到 /mnt 然后删除原始文件。【参考方案2】:

File.renameTo 可能会在您跨文件系统移动或尝试覆盖现有文件时失败。请参阅docs。

您也可能遇到问题,因为 /mnt 是 special purpose location,并且可能有其他属性阻止您将某些内容移入 /mnt。

【讨论】:

【参考方案3】:

创建一个复制文件的方法并调用这个方法(这是我在 renameTo() 不起作用时使用的方法):

void copyFile(File source, File destination) throws Exception 
  FileInputStream inputStream = new FileInputStream(source);
  FileOutputStream outputStream = new FileOutputStream(destination);
  int b = -1;
  while ((b = inputStream.read()) != -1) 
    outputStream.write(b);
  
  inputStream.close();
  outputStream.close();

编辑:如果要移动文件,请在复制后删除原始文件。

编辑:更好的是FileUtils.moveFile() from Apache Commons library

【讨论】:

moveFile() 是最好的方法。提出的实现是错误的(没有正确关闭流)并且效率低下(读取单个字节)。如果为简洁起见省略了这些内容,则应该注明。 对不起。我应该注意到,为了简洁起见,这是简化的。【参考方案4】:

一个简单的“不要重新发明***”的解决方案是使用 Apache Commons IO。它有FileUtils#moveFile() 负责处理不同的分区。

【讨论】:

以上是关于如何将文件重命名为另一个文件系统?的主要内容,如果未能解决你的问题,请参考以下文章

如何将文件重命名为子目录

如何使用 C# 将 .TXT 文件重命名为 .OLD? [关闭]

使用 Java 重命名文件

如何在 Linux 上将所有文件夹和文件重命名为小写?

如何重命名压缩文件名?

将多个目录中的文件重命名为目录名