11

あるディレクトリから別のディレクトリにファイルを移動しようとしたときにエラーが発生したプログラム。多くのデバッグを行った後、あるディレクトリから別のディレクトリにファイルを移動するだけの小さなユーティリティ プログラムを作成して、エラーを特定しました (以下のコード)。ローカル ファイル システム上でのファイルの移動は正常に機能しますが、ファイルを別のファイル システムに移動しようとすると失敗することが判明しました。

どうしてこれなの?質問はプラットフォーム固有のものかもしれません - それが重要な場合、私たちは ext3 で Linux を実行しています。

2 番目の質問です。クラスのrenameTo()メソッド以外のものを使用する必要がありましたか? Fileこれはローカルファイルシステムでのみ機能するようです。

テスト (ルートとして実行):

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"));
    }
}
4

4 に答える 4

19

Java7以降

を使用しFiles.move(Path source, Path target, CopyOption... opts)ます。

ATOMIC_MOVEファイルシステム間でファイルを移動するときにオプションを指定してはならないことに注意してください。

Java6以下

のドキュメントからFile.renameTo

[...]名前変更操作では、あるファイルシステムから別のファイルシステムにファイルを移動できない場合があります[...]

明らかな回避策は、新しいファイルを開いてファイルを「手動で」コピーし、コンテンツをファイルに書き込んでから、古いファイルを削除することです。

FileUtils.moveFileApacheCommonsのメソッドを試すこともできます。

于 2012-05-10T10:01:48.600 に答える
6

救助するJavadoc :

このメソッドの動作の多くの側面は、本質的にプラットフォームに依存します。名前変更操作は、ファイルをあるファイルシステムから別のファイルシステムに移動できない場合があり、アトミックではない場合があり、宛先の抽象パス名を持つファイルが成功しない場合があります。もう存在している。名前変更操作が成功したことを確認するために、戻り値を常にチェックする必要があります。

Filesクラスは、プラットフォームに依存しない方法でファイルを移動または名前変更するためのmoveメソッドを定義することに注意してください。

于 2012-05-10T10:02:25.183 に答える
1

ドキュメントから:

この抽象パス名が示すファイルの名前を変更します。

このメソッドの動作の多くの側面は、本質的にプラットフォームに依存します。名前変更操作は、あるファイルシステムから別のファイルシステムにファイルを移動できない可能性があり、アトミックではない可能性があり、宛先の抽象パス名を持つファイルの場合は成功しない可能性があります。もう存在している。名前変更操作が成功したことを確認するために、戻り値を常にチェックする必要があります。

異なるファイル システム間でファイルを移動する場合は、Apache のmoveFileを使用できます。

于 2012-05-10T10:08:24.670 に答える
-1

/some_other_disk/は相対URLですが、完全にURLであるため、あなたのIDはエラーです。例のURLが見つかりません

java FileMover D:\Eclipse33_workspace_j2ee\test\src\a\a.txt D:\Eclipse33_workspace_j2ee\test\src ファイルの移動に成功しました

java FileMover D:\Eclipse33_workspace_j2ee\test\src\a\a.txt \Eclipse33_workspace_j2ee\test\src

ファイルの移動が間違っていました

結果はurlでエラー

于 2012-05-10T10:27:32.460 に答える