Java File.renameTo()
は、特にWindowsでは問題があるようです。APIドキュメントと言い、
このメソッドの動作の多くの側面は、本質的にプラットフォームに依存します。名前変更操作は、あるファイルシステムから別のファイルシステムにファイルを移動できない場合があり、アトミックでない場合があり、宛先の抽象パス名を持つファイルがある場合、成功しない場合があります。もう存在している。名前の変更操作が成功したことを確認するために、常に戻り値を確認する必要があります。
私の場合、アップグレード手順の一部として、ギガバイトのデータ(さまざまなサイズのサブディレクトリとファイル)を含む可能性のあるディレクトリを移動(名前変更)する必要があります。移動は常に同じパーティション/ドライブ内で行われるため、ディスク上のすべてのファイルを物理的に移動する必要はありません。
そこにはならない移動するディレクトリの内容に任意のファイルのロックも、それでも、かなり頻繁に、renameTo()は、その仕事とはfalseを返しますを行うには失敗しました。(Windowsでは、おそらくいくつかのファイルロックがいくらか勝手に期限切れになると思います。)
現在、私はコピーと削除を使用するフォールバックメソッドを持っていますが、フォルダーのサイズによっては時間がかかることがあるため、これは面倒です。また、ユーザーがフォルダーを手動で移動して、何時間も待たないようにすることができるという事実を単に文書化することも検討しています。しかし、正しい方法は明らかに自動的かつ迅速なものになります。
だから私の質問は、Windows上のJavaで、単純なJDKまたはいくつかの外部ライブラリを使ってすばやく移動/名前を変更するための代替の信頼できるアプローチを知っていますか?または、特定のフォルダーとそのすべてのコンテンツ(おそらく数千の個別ファイル)のファイルロックを検出して解放する簡単な方法を知っている場合も、それで問題ありません。
編集:この特定のケースでは、renameTo()
さらにいくつかのことを考慮に入れるだけで、使用をやめたようです。この回答を参照してください。