Windows 7でファイルが消せない話

ファイルが消せない事ってよくあるよね。でもこの現象はちょっと違っていた。

  • Visual Studioから出力した実行可能ファイルだけ消せない(後に分かるが、VisualStudioは関係無かった)
  • 正確に言うと、消えたように見えるが、その後エクスプローラ方「最新の情報に更新」をクリックすると復活する
  • リネームや移動をすると「管理者権限が必要」と怒られる
  • 管理者権限のシェルからdeleteしても「管理者権限が必要」と怒られる
  • 所有者を見ると「現在の所有者を表示できません」と出る
  • 数分待つといつの間にか消える
  • 現象が発生するときと発生しないときがある、3日に1回くらい見る

ProcessExplorerからファイルハンドルを所有しているプログラムを調べると、「System」となっていた。Systemプロセスは殺せないので、代わりに怪しいアンチウイルスソフトを停止するが変わらない。じゃあサーチインデクサがロックしてる?と思ってWindows Searchサービスを止めたがやはり効果なし。

この現象に半年くらい悩んでいたが、ようやく原因がわかった。
Why would SYSTEM continue locking executable file handles after the app has exited?

2.Enable the "Application Experience" service and set it to "Automatic"

らしいです。Application Experienceサービスを起動したら治った。こいつは「プログラム互換性を提供する」サービスらしい。旧Windowsとの互換性を保つためのものだと思うが、なぜこんな現象が起こったのだろうか。ちなみにVisualStudioから出力したバイナリは.NET Framework 4.0なので別に古いバイナリ形式というわけでもない・・・。むしろCLI・・・。

結局よく分からんが治ったからよかった。これまではこの現象が起きるたびにVisual Studioを再起動したりPCを再起動したり大変だったんだよね。

追記
よく見たらMicrosoftサポートに載っていました。

Windows で実行プログラムを終了後、SYSTEM プロセス により 60 秒間ファイル ハンドルが確保される

本サービスは、起動するアプリケーションに対して、アプリケーションの互換性に関する処理を行いますが、Application Experience サービスのスタートアップの種類が [無効] になっている場合、Application Experience サービスを起動することができません。任意のアプリケーションが終了後、SYSTEM プロセスが当該実行ファイルのファイル ハンドルを確保し、Application Experience サービスによる処理が行われることを期待します。しかし、Application Experience サービスが無効化されている場合、サービスが起動されないため、SYSTEM プロセスは 60 秒のタイムアウトを待ったのち、実行ファイルのハンドルの解放処理を実施します。

って書いてるけど、一律60秒待つって仕様はどうよ。サービスが起動してるかどうかくらいは見てほしいんだけど…。

2件のコメント

  1. 匿名 より:

    こんにちは
    私もこの現象に長い期間悩まされていました。
    情報のご提供に感謝致します。

    1. withpop より:

      コメントありがとうございます。
      お役に立てたようで幸いです。

ただいまコメントは受け付けていません。