misc.log

日常茶飯事とお仕事と

ファイルを掴んでいるプログラムを特定する方法

某所で書いたら意外に皆さん知らなかったようなので書いておきます。Windowsでファイルを削除したり名称変更しようとすると、別のプログラムが使っているので変更できない、といったエラーが出る事があります。こういう場合、後述の方法で「誰がファイルを掴んでいるのか」を調べられるかもしれません。
(あくまでローカル環境での話ですので、ネットワーク越しに掴まれているものや、インフラの運用で役立つ情報というわけではありません。ご了承ください)

ファイルやフォルダーの利用者をリソースモニターで検索する

リソースモニターという、タスクマネージャーの高機能版のようなツールがWindowsには標準搭載されています。これで、CPUタブにある「関連付けられたハンドル」というエリアの検索欄にファイル名やフォルダー名を入力すると、それを使っているプログラム(プロセス)を特定できることがあります。

リソースモニターの起動方法はいくつかありますが、一番手っ取り早いのはタスクマネージャーの「パフォーマンス」タブを開き、下部にあるリンクから起動する方法かと思います。

f:id:frontline:20211019010148p:plain
タスクマネージャーからリソースモニターを起動する

リソースモニターが起動したら、上部にある「CPU」タブを選択。その下段にある「関連付けられたハンドル」という部分の右端に入力欄があるので、そこにファイル名やフォルダー名を入力してください。「検索中」という文字が出てしばらく待つと、ファイルを利用しているプログラムの名称が表示されます。

f:id:frontline:20211019010604p:plain
Wordで開いているファイルを条件にした場合の例

WordやExcelの場合はファイル名で検索できますが、テキストファイルをメモ帳(Notepad.exe)などで開いた場合は、どうやらフォルダー名でないと出てこないようです。

下図の例は、1つのファイルを複数のプログラムで開いてみた状態の例です(実際にはあまり無いシチュエーションですが)。テキストエディターなどの場合、ファイルではなく検索条件はファイルがあるフォルダー名を利用します。

f:id:frontline:20211019013237p:plain
テキストファイルを複数プログラムで開き、フォルダーで検索した例

上図の例では、「サクラエディタ(sakura.exe)」「Visual Studio Code(Code.exe)」と、ファイル操作で使うWindowsエクスプローラー(explorer.exe)がフォルダーとファイルを表示しています。

たとえば、表向きExcelはクラッシュしてしまったのだけれど、裏では動いており、ファイルを掴んだままになっている……といったようなパターンなどで、こうした検索が使えると思います。
ファイルが掴まれたままになっている状況は、PCやサーバーを再起動すればおそらく解消します。しかし、開発環境やシステムの稼働環境ではそうも行かない状況も有ると思いますので、困ったときの手のひとつとして参考になれば幸いです。

プロセスが掴んでいるファイルを調べる

逆に、特定のプロセスが掴んだり参照しているファイルやフォルダーを調べる場合ですが、検索条件を入れずに、CPUタブの上部にあるプロセス一覧の左にあるチェックをONにしてください。そうすると、下部の関連付けられたハンドル欄に、プロセスが掴んでいる、Windows上の様々なものの一覧が表示されます。

補足:コマンドで同じようなことをやる

PowerShellとか使えば多分できるんだろうなぁ……と思ってたら、もっと簡単にずらっと結果を出せる方法について紹介してくださってるサイトがありました。

www.orangeitems.com

管理者権限でのコマンドプロンプトからの処理になります。これをササッと繰り出せると格好いいかも知れません。つかってみよう。

なお、公式ドキュメントはこちら。

docs.microsoft.com

補足:その他諸々

そのほかのツールや方法もはてブコメントでいろいろ提示いただきました。ありがとうございます。あまり深く踏み込む余裕がないので、名称とリンクだけ列挙しておきます。もしかしたら公式サイトじゃないものを貼っているかもしれませんがご容赦を(最後はご自分で検索してダウンロードしてください)。