Win: どのプログラムがファイルを開いているか調べるには

ファイルやフォルダを移動/削除/名前変更しようとすると、こんなメッセージが表示されることがある。

xxxxxxx を削除できません。ほかの人またはプログラムによって使用されています。
ファイルを使用している可能性があるプログラムをすべて閉じてから、やり直してください。

どのプログラムが使ってるのかを知りたくなるわけだけど。

ちょっと違うと思う例

@IT の Tips 記事には、

  • XP 系では openfiles コマンドで調べる
  • NT/2000 では Sysinternals の Filemon で調べる

とか書いてある。ただ、ローカルユーザ限定で言うと、この記事はかなり「使えない」と思う。なぜなら。
まず、openfiles が有効なのは、再現性がある場合だけだ。何かの作業をしていたら上記のメッセージが表示され、何が原因なのか見当がつかない……という場合も多いが、そういうパターンでは再起動した時点で「直って」しまうため、openfiles では役に立たない (常に /local on なら別だろうけど)。
また、Filemon を使うのも片手落ちだ。Filemon は、ファイルに対する操作を監視するためのツールであって、ファイルをつかんでいるプログラムがそのファイルに対してアクセスしなければ、何も表示されない。

じゃぁどうすればいいのか

Filemon と同じ Sysinternals のツール、Process Explorer を使えばいい。

Sysinternals - Process Explorer
http://www.sysinternals.com/Utilities/ProcessExplorer.html

これは実行中のプロセス一覧を表示するためのツールだけど、各プロセスが保持しているハンドルも表示してくれる。さらに、条件に合致するハンドルを検索してくれる機能もある。

  1. ダウンロードしてきて、起動する。
  2. メニューの [Find]→[Find Handle...] を選択する。
  3. [Process Explorer Search] ダイアログが起動したら、[Handle or type] のところに、ロックされちゃってるファイルやフォルダのパスを入れる。部分一致なので、フルパスじゃなくて、名前だけとかでもいい。
  4. そのすぐ下のリストビューに、条件に合致するハンドルと、それを保持している exe が表示される。

これだけ。リストビューでダブルクリックすれば、メインウィンドウでそのプロセスがアクティブになる。

CUI でやりたい場合は

なんらかの理由でコマンドラインからやりたい場合は、Process ExplorerCUI 版にあたる Handle というツールが使える。

Sysinternals - Handle
http://www.sysinternals.com/Utilities/Handle.html