フォルダーをリネームしようとすると、エラーが表示されることがある。フォルダー内のファイルやサブフォルダーなどを開いているプロセスがあるからだ。Windows 10/11には、ファイルやフォルダーを開いているプログラムを探すユーティリティがいくつかある。今回は、これを解説する。とりあえず、こうしたユーティリティを「ファイルオープンユーティリティ」と総称することにする。
そもそもファイルが「開かれている」状態とは?
多くのプログラムは、ファイルを読み出して情報を得て、ファイルに書き込んで情報を保存する。プログラムからファイルを扱うとき、対象となるファイルを「オープン」する必要がある。これは、対象をOSに通知し、読み書きのアクセスを準備するための機能だ。
このときの対象は、正確にはプログラムではなく、プログラムの実行状態であるプロセスである。1つのプログラムを複数同時に起動すると、それそれは別の「プロセス」となる。
Windowsでは、ファイルをオープンするとき、モード、アクセス、共有といった情報を設定する。共有は、オープン中に他のプロセスからのアクセスを許すかどうかの指定である。もし、共有を許さない場合、オープンされたファイルは、他のプロセスからはアクセスできないようにOSが制限をかける。このため、ファイルがオープンされていると、ファイルを区別するパスが変わらないように、ファイルが置かれているディレクトリなどの名前を変更することができなくなる。
Windowsでは、APIを使ってカレントディレクトリを設定できる。カレントディレクトリを使うことで、パスを絶対指定ではなく、相対指定で指定できるようになる。このとき、該当のディレクトリに制限が付き、たとえばディレクトリの名前変更や削除ができなくなる。
もう1つ、Windowsでは、プログラムが起動されると、その実行ファイルに対して、書き込みや削除などができなくなる。
つまり、ディレクトリやファイルの名前変更や削除、移動などでエラーが出る場合、以下の可能性がある。
・ディレクトリやサブディレクトリにあるファイルをオープンしているプロセスがある
・ディレクトリをカレントディレクトリに設定しているプロセスがある。
・ディレクトリやサブディレクトリにあるプログラムが起動されている
なお、俗にこうした状態を、ファイルやディレクトリが「ロック」されているということもあるが、ファイルアクセスでは「ロック」はファイル全体や一部の読み書きを禁止する機能をさす機能であるため、正確な言い方ではない。
ファイルオープンユーティリティはこれだけある
以下の表は、ファイルやフォルダーを開いてるプロセスを探す「ファイルオープンユーティリティ」のリストだ。複数のプログラムがあるが、それぞれ一長一短。コマンドラインプログラムが2つ、GUIが3つある。ただし、GUIの3つのうち2つは、Windowsの機能で、ファイルのオープン状態を探すための専門のプログラムではない。
結論から言えば、ローカルファイルを開いているプロセスを探すなら「Handle.exe」、LAN側からのアクセスされているファイルを探すならopenfiles.exe、または「コンピュータの管理」→「システムツール」→「共有フォルダー」(以下、共有フォルダー)である。それでは、個々のプログラムを簡単に解説する。
プロセスがオープンしている「ハンドル」を列挙するHandle.exe
Handle.exeは、Microsoftが配布しているSysinternal製のコマンドラインプログラムだ。
ファイル名の一部、プロセス名の一部から検索が可能で、必要な情報を簡単に得ることができる。ただし、対象はローカルファイルへのローカルプロセスからのアクセスのみで、リモートからのファイルアクセスを探すことはできない。
このプログラムは、プロセスがオープンしている「ハンドル」を列挙するもの。対象プロセスを停止させることはできないが、強制的にハンドルをクローズすることはできる。基本的には、このコマンドでファイルを開いてるプロセスを探し、プロセス番号(pid)を探して、該当のプロセスを停止させる。
ファイル名からの検索は、オプションなしにコマンドラインにキーワードを入れれば、そのキーワードを含むファイルを表示する。あるいは、「-p プロセス名」で実行ファイルの名前やその一部を指定することでファイルをオープンしているプロセスの中から特定のプロセスを検索できる。
ダウンロードは以下のURLから可能だ。
●Handle - Sysinternals
https://learn.microsoft.com/en-us/sysinternals/downloads/handle
ローカルファイルをアクセスしている
プロセスを列挙する「openfiles.exe」
続いて、openfiles.exeは、Windowsの標準コマンドである。
標準では、リモートからアクセスされているファイルのみを列挙する。実行には管理者権限が必要。開かれているファイル一覧を表示する場合には検索機能はないので、他の文字列検索コマンド(たとえば、PowerShellならSelect-Stringコマンド)と組み合わせて利用する。
ローカルファイルをアクセスしているローカルプロセスを列挙するには、まず、「/local on」としてシステムフラグを設定する。ただし、有効になるのは再起動したあとだ。再起動が必要になるため、事前に準備していないと使えない可能性がある。
事前設定はしなくても、リモートからアクセスされているファイルを列挙できるので前述のHandle.exeと使い分けするという方法もある。
「/?」でオンラインヘルプを表示できるが、Microsoftのサイトに解説のページがある。
●openfiles
https://learn.microsoft.com/ja-jp/windows-server/administration/windows-commands/openfiles

この連載の記事
-
第477回
PC
Windowsで2つの文字列を同時に含むテキストファイルを探す方法を考える -
第476回
PC
さらばSkype! Windows&MSのコミュニケーションアプリの30年 -
第475回
PC
Windowsのコマンドラインの補完機能について解説 -
第474回
PC
Windowsでのコマンドラインのヒストリ機能 -
第473回
PC
Windowsは内部的にどうやってインターネットへの接続状態を確認している? -
第472回
PC
WindowsのエラーをMicrosoftに送信するテレメトリ機能を理解する -
第471回
PC
Windowsのコマンドラインでエイリアスを使う -
第470回
PC
Windows用のパッケージマネージャー「Winget」 プレビュー版で機能が充実してきた -
第469回
PC
Windows Updateの27年 悪役だった頃から改良が進んで、徐々に目立たない存在に -
第468回
PC
2025年のWindowsどうなる!? Windows Insider Programの状況をあらためて見る -
第467回
PC
Copilot+ PCのNPUでカメラを処理する「Windows Studio Effects」 その内容や効果は? - この連載の一覧へ