9

問題は、残りのロジックが機能する前にファイルを移動する必要があるため、メソッドがfalseを返すと、実行を停止することです。

ただし、Windowsエクスプローラーでファイルを確認すると、新しい名前が付けられて移動しました。

なぜこれが起こっているのか興味があります。

これが私が問題を再現しようとしたサンプルコードです。それはほとんど同じことであり、正常に機能しています。

File testfile = new File("TestFile");

    if(!testfile.exists()){

        testfile.mkdirs();

    }

    File sample = new File("sample.txt");

    if(sample.exists()){

        boolean success = sample.renameTo(new File(testfile.getPath() + "\\" + sample.getName()));

        if(success){

            System.out.println("Moved");

        }
        else{

            System.out.println("Failed");

        }

    }

編集:それを解決しました。こんなに馬鹿げたことでみんなの時間を無駄にしてすみません。しかし、この投稿をしなければ、これを追跡したとは思いません。

解決策は、実際にいくつかのファイルをループして移動することでした。出力が失敗したと言ったとき、プログラムは停止しました。エクスプローラーを調べたところ、最初のファイルだけが実際に移動されたので、移動してからfalseを返したと思いました。ただし、問題は、インデックスとして間違った変数を使用していたことでした。そのため、インデックス0のファイルが正常に移動し、ループが繰り返されてもインデックスが増加しなかったため、インデックス0を再度移動しようとしました。したがって、失敗しました。

私が言ったように、非常に愚かですが、私と一緒に耐えてくれてありがとう。

4

3 に答える 3

18

File.renameTo()特にWindowsでは、Javaに問題があるようです。APIドキュメントにあるように:

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

FileUtils.moveFile()JDK7のメソッドを含むapache.commons.ioライブラリを使用できますFiles.move()

于 2013-02-01T17:20:45.380 に答える
1

ファイルのどこかでInputstreamが開いているが、閉じられていないため、名前の変更が機能していない可能性はありませんか。閉じる前に、ファイルオブジェクトに関連する開いているすべてのストリームを閉じてみてください。

于 2013-02-01T17:32:48.313 に答える
0

これは私のために働いた

File file = new File("E:/Javadocs/" , "new.txt");   

File file1 = new File("E:/Javadocs/" , "myDoc.txt");          

file1.createNewFile();

if (file1.exists()){  
  System.out.println(file1.renameTo(file));
}

これにより、ファイルmyDoc.txtが作成され、名前がnew.txtに変更され、trueが出力さ
れます。File(URI)コンストラクターでも正常に機能しました。

于 2016-06-25T13:50:20.540 に答える