削除する必要のあるファイルがまだ使用されている場合があるため、Windows プラットフォームで失敗する Java で記述されたスケジュールされたタスクがあります。Java 内からどのプロセスがファイルを使用しているかを確認し、それらに関する情報を取得する方法はありますか?
私は、必要に応じて JNA または JNI を使用する用意があることを付け加えたいと思いました。
これを行う汚い方法の 1 つは、アプリケーションを管理者特権で実行し、 ProcessBuilderを使用してHandleなどのコマンド ユーティリティを呼び出すことです。
優れたSysinternals Process Explorerを使用してこれを行うことができ、Java プロセスに限定されません。
詳細については、この投稿を参照してください。ただし、Java からこの機能を呼び出す方法がわかりません。
私自身の予備的な答え(お願いします、誰かがもっとうまくやってください!):
理想的には、Process Explorer、unlocker、handler などのツールが行うことをプログラムで行う方法を学び、JNA などを使用して Java から呼び出す方法を学びたいと考えています。しかし、これには Windows のリリースごとに変更されるデータ構造が含まれているように見えるため、非常に壊れやすいように思えます。関連するシステム コールは、NtQuerySystemInformation という名前のようです。
私たちが対処しているような場合、Windows Vista 以降の推奨されるアプローチは、システムの再起動をトリガーし、開いているすべてのファイルハンドルをクリアする「再起動マネージャー API」を使用することです。(ソース: http://social.msdn.microsoft.com/Forums/sv/netfxbcl/thread/37dc9843-2583-41fc-8260-b78183aa4bed ) できることなら、絶対にやりたくないことです。