2011-08-17 8 views
3

renameTo()を使用する際に奇妙な問題が発生しました。 /mnt/desttestに名前を変更できない理由はわかりませんが、/home/kit.ho/desttestに名前を変更しても問題ありません。しかし、私はすでにすべての書き込み許可を/ mnt /に与えています。特定の理由がないのに戻り値はfalseです。理由は誰が知っていますか?ファイルを別のファイルシステムにリネームする方法は?

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/desttest'でも問題なく使えますか? – 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()'が最良の方法です。提示された実装はバグ(ストリームを適切に閉じない)と非効率的(1バイトを読み込む)です。これらのことが簡潔さのために中止された場合、それは注目されていたはずです。 – musiKk

+0

申し訳ありません。私はこれを簡潔にするために簡略化していることに留意すべきである。 –

6

ファイルシステム(パーティション)間で名前を変更することはできません。

+0

oops。何か回避策はありますか? –

+1

@Kit Ho:すべてを/ mntにコピーして元のファイルを削除する必要があります。 –

1

File.renameToは、ファイルシステムを移動している場合、または既存のファイルを上書きしようとすると失敗することがあります。 docsを参照してください。

また、/ mntがspecial purpose locationであり、/ mntに何かを移動できないような他の属性がある可能性があるため、問題が発生する可能性があります。

2

「車輪の再発明をしていない」簡単な解決策は、Apache CommonsのIOを使用することです。異なるパーティションの処理を担当するのはFileUtils#moveFile()です。

関連する問題