フォルダーをリネームしようとすると、エラーが表示されることがある。フォルダー内のファイルやサブフォルダーなどを開いているプロセスがあるからだ。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

この連載の記事
-
第508回
PC
Scalable Vector Graphics(SVG)そもそも何なのか? -
第507回
PC
Windows 11の「開発者モード」とは何か? -
第506回
PC
Windows 11は早くも来秋登場の26H2プレビューの準備が始まる -
第505回
PC
結構変化しているWindows 11のエクスプローラーの基本設定を見直す -
第504回
PC
新しいOutlookとOutlook Classic、そろそろ古いOutlookとExchangeの組み合わせは引退の頃合いか -
第503回
PC
機能が増えたこともあり、寄せ集めから統合化に進むWindowsの便利ツール「PowerToys」 -
第502回
PC
Windows 11でBluetoothのオーディオ新規格「Bluetooth LE Audio」を試す -
第501回
PC
Windows 11 Ver.25H2での変更点、新機能を整理する -
第500回
PC
Windows 11 Ver.25H2が完成した -
第499回
PC
Windowsでの致命的だが回復可能なエラーに備える手段を2つ紹介 -
第498回
PC
Windows Terminalの安定版V1.23が公開 設定UIが改良される - この連載の一覧へ















