このページの本文へ

前へ 1 2 次へ

Windows Info 第356回

フォルダーやファイルがリネームできない! ファイルを開いているプロセスを探す方法

2022年12月04日 10時00分更新

文● 塩田紳二 編集● ASCII

  • この記事をはてなブックマークに追加
  • 本文印刷

フォルダーのリネームなどでエラーになることがある。原因となるプログラムが表示されることもあれば、ハッキリとしないことも

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

Sysinternalのhandle.exeは、プロセスが開いているハンドルを列挙するもの。その中にファイルやディレクトリが含まれる。キーワード指定でファイルを検索できる

 ファイル名の一部、プロセス名の一部から検索が可能で、必要な情報を簡単に得ることができる。ただし、対象はローカルファイルへのローカルプロセスからのアクセスのみで、リモートからのファイルアクセスを探すことはできない。

 このプログラムは、プロセスがオープンしている「ハンドル」を列挙するもの。対象プロセスを停止させることはできないが、強制的にハンドルをクローズすることはできる。基本的には、このコマンドでファイルを開いてるプロセスを探し、プロセス番号(pid)を探して、該当のプロセスを停止させる。

 ファイル名からの検索は、オプションなしにコマンドラインにキーワードを入れれば、そのキーワードを含むファイルを表示する。あるいは、「-p プロセス名」で実行ファイルの名前やその一部を指定することでファイルをオープンしているプロセスの中から特定のプロセスを検索できる。

 ダウンロードは以下のURLから可能だ。

●Handle - Sysinternals
 https://learn.microsoft.com/en-us/sysinternals/downloads/handle

ローカルファイルをアクセスしている
プロセスを列挙する「openfiles.exe」

 続いて、openfiles.exeは、Windowsの標準コマンドである。

Windows標準装備のopenfiles.exeは、事前設定なしでは、ネットワークファイル共有でオープンされているファイルのみを表示する

 標準では、リモートからアクセスされているファイルのみを列挙する。実行には管理者権限が必要。開かれているファイル一覧を表示する場合には検索機能はないので、他の文字列検索コマンド(たとえば、PowerShellならSelect-Stringコマンド)と組み合わせて利用する。

 ローカルファイルをアクセスしているローカルプロセスを列挙するには、まず、「/local on」としてシステムフラグを設定する。ただし、有効になるのは再起動したあとだ。再起動が必要になるため、事前に準備していないと使えない可能性がある。

 事前設定はしなくても、リモートからアクセスされているファイルを列挙できるので前述のHandle.exeと使い分けするという方法もある。

 「/?」でオンラインヘルプを表示できるが、Microsoftのサイトに解説のページがある。

●openfiles
 https://learn.microsoft.com/ja-jp/windows-server/administration/windows-commands/openfiles

前へ 1 2 次へ

カテゴリートップへ

この連載の記事

注目ニュース

ASCII倶楽部

プレミアムPC試用レポート

ピックアップ

ASCII.jp RSS2.0 配信中

ASCII.jpメール デジタルMac/iPodマガジン