2011-08-17 79 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(),負責處理不同的分區。

相關問題