1. ホーム
  2. java

[解決済み] WindowsでFile.renameTo()の代替となる信頼性の高いツールは?

2023-01-11 17:02:01

質問

Java の File.renameTo() は、特にWindowsでは問題があるようです。 として API ドキュメント にはこうあります。

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

私の場合、アップグレード手順の一部として、ギガバイト単位のデータ (多くのサブディレクトリとさまざまなサイズのファイル) を含むディレクトリを移動 (名前の変更) する必要があります。移動は常に同じパーティション/ドライブ内で行われるので、ディスク上のすべてのファイルを物理的に移動する本当の必要はありません。

そこで べきではない は移動するディレクトリのコンテンツに対していかなるファイル ロックも存在しないはずですが、それでも、かなりの頻度で renameTo() はその仕事を行うことができず、false を返します。(おそらく、いくつかのファイル ロックが Windows 上で多少恣意的に期限切れになるのではないかと、私は推測しています)。

現在、私はコピー & 削除を使用するフォールバック メソッドを持っています。 たくさん を要することがあるからです。私はまた、潜在的に、何時間も待つことを避けるために、ユーザーが手動でフォルダを移動できるという事実を単に文書化することを検討しています。しかし、正しい方法は、明らかに自動的で迅速なものでしょう。

そこで、私の質問です。 Windows 上で Java を使って素早く移動/名前変更を行うための、代替の信頼できるアプローチをご存知ですか? JDKまたはいくつかの外部ライブラリで。または、もしあなたが 簡単な を検出し、任意のフォルダのファイルロックを解除する方法を知っている場合。 そのすべてのコンテンツ (おそらく何千もの個々のファイル) のために、あらゆるファイル ロックを検出し解放する方法があれば、それもよいでしょう。


編集 : このケースでは、単に renameTo() で済んでいるようです。 この回答 .

どのように解決するのですか?

また Files.move() メソッドも参照してください。

例です。

String fileName = "MyFile.txt";

try {
    Files.move(new File(fileName).toPath(), new File(fileName).toPath(), java.nio.file.StandardCopyOption.REPLACE_EXISTING);
} catch (IOException ex) {
    Logger.getLogger(SomeClass.class.getName()).log(Level.SEVERE, null, ex);
}