Windows 7の使用を開始して以来、この問題に悩まされてきました。時々、その他のフォーラムに同様の質問が表示されますが、答えが表示されませんでした。ほぼ常にそれを再現する2つのシナリオを次に示します。
探検家の方法
- エクスプローラーで、少なくとも1つのexeファイルを含むディレクトリに移動します
- すぐに1つのディレクトリに移動する
- 移動したばかりのディレクトリを削除します
- 収量は、フォルダのアクセスが拒否されまし示すダイアログあなたはこのフォルダに変更を加えるために、管理者の許可を必要とし、このアクションを実行する権限を必要とするボタンがと、再試行してくださいとキャンセル
- [ 再試行]を押してもすぐには機能しません。1分ほど待ってからもう一度クリックすると機能します
注:ステップ2で、1つのディレクトリに移動する前に1分以上待機している場合、問題は発生せず、フォルダを削除できます。
Visual Studioの方法
- exeファイルを生成するプロジェクトをビルドします
- 実行可能ファイルを実行してから閉じます
- すぐにプロジェクトを再度ビルドします(たとえば、ソースファイルの単一の文字を変更することによって)
- 収量致命的なエラーLNK1168:書き込み用に開くことができません/path/to/the.exe
注:ステップ2で、1分以上待ってから再度ビルドする場合、問題は発生しません。
いくつかの仕様
- VS2008 / 2010/2011で、Windows 7 32ビットと64ビットの両方で発生します
- 3つの異なるマシンで発生します
- ウイルススキャナーがありません
- 多数のサービスを無効にしていますが、Windowsの正常な実行を妨げるものはなく、UACも無効になっています
- あらゆる種類のディスクで発生します
- 常に管理者グループに属するユーザーアカウントを使用します
明らかに、両方のシナリオは非常に似ており、非常に再現性があります。そのため、何らかのプロセスで何らかの理由でファイルを開いて、後で再びリリースする必要があると考えました。ただし、sysinternalsを使用する
handle -a
問題のexeファイルは表示されません。(これが正しいハンドルの使用方法ですよね?)したがって、explorer / VSがファイルにアクセスできないと報告している間、handle.exeはどこでも使用されていないと言います。これはかなり無知なので、誰かが解決策を思い付くことができるかどうか疑問に思っています。
質問に答えて更新します。
- セーフモードで問題を再現できませんでした
- 多数のシェル拡張機能がインストールされます。SellExViewからは、すべてのマシンに共通のMicrosoft以外のものがあります:NitroPDF、WinRAR、TortoiseGit、TortoiseSvn、NVidia。Tortoiseのものが最も疑わしいと思いますが、両方の[ステータスキャッシュ]オプションが[1つのフォルダーのステータスキャッシュのみ、再帰的オーバーレイなし]に設定されています。つまり、TortoiseCache.exeが実行されていません。
- エクスプローラーの問題により、ProcessExplorerは実行可能ファイルを表示しません。ただし、実行可能ファイルのディレクトリは表示されますが、削除された後も表示され続けるため、実際には関連していないようです
- VSの問題では、ターゲットディレクトリでエクスプローラウィンドウが開いていない場合でも、VSで発生します。繰り返しますが、ProcessExplorerは実行可能ファイルも実行可能ファイルのディレクトリも表示しません。VSのこの「モード」では、実行可能ファイルを実行しているときにのみ問題が発生することに注意してください。実行していない場合、何度も問題なくビルドできます。
- 「VSモード」および実行可能ファイルのディレクトリで開かれたエクスプローラーウィンドウ(C#exeのみでテスト)では、奇妙になります:VSが別のプロセスで使用されているとVSが不平を言っているので、再びビルドできません。ただし、開いているエクスプローラウィンドウからexeを削除すると、これは機能し、結果としてビルドは成功します。繰り返しになりますが、ProcessExplorerの参照は一切ありません。どちらが私の調査結果をhandle.exeと一致させるようです(PEとハンドルはいずれにしても内部的に同じAPIを使用しませんか?)
更新2 単なるエクスプローラーではありません。explorer.exeを終了した後、VSの問題はまだ残っています。
Update 3 Asherが示唆するプロセスモニターを使用すると興味深い事実が明らかになります。エクスプローラーモードの場合、ディレクトリを開くとIRP_MJ_CREATEが10回呼び出されます。ただし、IRP_MJ_CLEANUPの呼び出しは9つだけです。この呼び出しはすべてshell32.dll内から行われるため、サードパーティのインストールの問題ではありません。そして、問題を引き起こすのは明らかにIRP_MJ_CLEANUPが欠落しているものです。ディレクトリを開いてからちょうど1分後に、システムプロセス自体がIRP_MJ_CLEANUP呼び出しを発行し、ファイルが解放され、削除されます。
しかし、私はまだこれがなぜ起こるのか理解できませんでした。私が行った変更によって引き起こされたエクスプローラーのバグですか?
解決!無効にしたサービスを調べてみると、アプリケーションエクスペリエンスの説明に、起動時にアプリケーションのプロセスアプリケーション互換性キャッシュリクエストが記載されていることがわかりました。おなじみですね。実際、サービスを開始した後は、もう問題を再現できず、ProcMonの出力は異なり、短くなります。面白いのは、サービスを再び停止した後、すべてがまだ正常であり、procmonの出力がまだ短いためです。
私は2台のマシンでこれを試しましたが、すべてのサードパーティ製のものは問題なく実行されていて、すべてはまだ問題ありません。
これが本当のバグかどうかはわかりませんが(「サービスを無効にすることで何を期待しますか」と言うこともできます)、サービスを開始してから再び停止するだけで問題が解決するのはまったく正常ではありません。
報奨金は、これについてより深い洞察を提供できる人、または最終的に正しい方向に導いたProcMonを指し示してくれた@Asherに行きます。