2011-08-17 78 views
3

我在使用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”外部命令对这个问题的任何解决方法吗?

+0

'/ mnt'是一个单独的分区吗? –

+0

你可以'mv /home/kit.ho/test/mnt/stesttest'没有问题吗? – Martin

+0

@Mechanical:yes/mnt位于单独的分区上。 –

回答

4

创建复制文件,并调用该方法的方法(这就是当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

+0

'moveFile()'是最好的方法。提出的实现是错误的(不正确关闭流)和低效率(读取单个字节)。如果为了简洁起见这些东西都被忽略了,那应该已经注意到了。 – musiKk

+0

对不起。我应该指出,这是简化的简化。 –

6

你不能做跨文件系统(分区)的重命名。如果你跨文件系统移动

+0

哎呀。 ..有什么解决方法吗? –

+1

@Kit Ho:您必须将所有内容复制到/ mnt,然后删除原始文件。 –

1

File.renameTo可能会失败,或者如果你想覆盖现有文件。请参阅docs

,因为到/ mnt是special purpose location,并可能有阻止你移动到东西到/ mnt其他属性也可能有问题。

2

一个简单的“不重新发明轮子”的解决办法是使用Apache下议院IO。它有FileUtils#moveFile(),负责处理不同的分区。

相关问题