ファイルをつかんでいるプロセスは何か、をWindowsで見つけ出す方法です。
下記記事の関連です。
某所で書いたら意外に皆さん知らなかったようなので書いておきます。Windowsでファイルを削除したり名称変更しようとすると、別のプログラムが使っているので変更できない、といったエラーが出る事があります。こういう場合、後述の方法で「誰がファイルを掴んでいるのか」を調べられるかもしれません。
(あくまでローカル環境での話ですので、ネットワーク越しに掴まれているものや、インフラの運用で役立つ情報というわけではありません。ご了承ください)
コマンドプロンプトでワンラインでできたらもっと便利かと思いまして。
ファイルをロックしているのがローカルのプロセスの場合
答えは管理者権限で起動したコマンドプロンプトから、以下を入力するだけです。
# openfiles
でも、デフォルトの状態だと、ローカルのプロセスが、ローカルのファイルをどうロックしているかについては結果は返ってきません。
以下のコマンドで、機能をデフォルトにする必要があります。
# openfiles /local on
打ったら再起動してください。
※なお、元に戻す方法は、
# openfiles /local off
です。
その後、openfilesコマンドを入力すると、今OS上で開いているファイルが全部出てきます。
で、やってみると分かるんですが、ものすごく出てくるんですね。単にブラウザーを開いているだけなのに、結構裏側ではいろいろファイルつかんでるんだなと感心しました。
ただ、このファイルのロックだけ確認したい、っていうときはopenfilesコマンドだけだと時間もたくさんかかるので、しぼりこみましょう。
例えばc:\temp\test.txtだけのロックの状態が知りたい時は、以下のようにします。
まあWord 2016って書いてあるんですけどね。
# openfiles | findstr "test.log"
結果はこちら。
ちゃんと、プロセス名まで出るのでここでわかります。
※ただし、結果が出るまでに数分かかります(後述)。
ファイルをロックしているのがネットワークのプロセスの場合
ファイル共有経由で開いているローカルファイルのロックについては、openfilesコマンドはデフォルトで表示してくれます。
# openfiles
上の赤いところは、ネットワーク共有でログインしたユーザー名が出ますので、そのユーザーの人に閉じてもらえれば解決です。
備考
なお、openfilesコマンドは、本記事の冒頭で
# openfiles /local on
をしなかった場合、サクっと出ます。もしオンにしたら、ローカルのファイルを探しに行くので数分待たないと出ないです。不便。
ファイルのロックについて、ファイル共有経由のものだけ知りたければ、デフォルトの設定に戻しておきましょう。以下のコマンドの後再起動で元に戻ります。
# openfiles /local off
デフォルトの設定で使うのがいいなと思いました。