Windows 7을 사용하기 시작한 이후로이 문제로 인해 귀찮았습니다. 때때로 나는 다른 포럼에서 비슷한 질문이 나타나는 것을 보았지만 답을 보지 못했습니다. 거의 항상 그것을 재현하는 두 가지 시나리오는 다음과 같습니다.
탐험가 길
- 탐색기를 사용하여 하나 이상의 exe 파일이 포함 된 디렉토리로 이동하십시오.
- 하나의 디렉토리로 즉시 이동
- 방금 이동 한 디렉토리를 삭제하십시오.
- 수익률은 폴더 액세스가 거부 라는 대화 당신은 당신이 폴더를 변경하려면 관리자의 허가를 필요로이 작업을 수행 할 수있는 권한이 필요합니다 버튼과 함께, 다시 시도 및 취소
- 친 다시 시도를 즉시 작동하지 않습니다. 1 분 정도 기다렸다가 다시 클릭하면 작동합니다
참고 : 2 단계에서 하나의 디렉토리로 이동하기 전에 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 파일은 절대 나타나지 않습니다 . (즉, 핸들을 사용하는 올바른 방법입니까?) 탐색기 / VS에서 파일에 액세스 할 수 없다고보고하는 동안 handle.exe는 어디에서나 사용 중이 아니라고 말합니다. 이로 인해 나는 실마리를 얻지 못하므로 누군가가 해결책을 찾을 수 있는지 궁금합니다. 왜 이런 일이 발생하며 어떻게 해결할 수 있습니까?
질문에 대한 답변으로 업데이트 :
- 안전 모드에서 문제를 재현 할 수 없습니다
- 많은 셸 확장이 설치되었습니다. SellExView에는 NitroPDF, WinRAR, TortoiseGit, TortoiseSvn, NVidia와 같은 모든 컴퓨터에 공통적 인 Microsoft 이외의 제품이 있습니다. '상태 캐시'옵션 모두 '한 폴더에 대해서만 상태 캐시, 재귀 오버레이 없음'으로 설정되어 있지만 TortoiseCache.exe가 실행되지 않는 Tortoise가 가장 의심 스럽습니다.
- 탐색기 문제로 ProcessExplorer가 실행 파일을 표시하지 않습니다. 실행 파일의 디렉토리는 표시하지만 삭제 된 후에도 계속 표시되므로 실제로는 관련이 없습니다.
- VS 문제의 경우 대상 디렉토리에서 탐색기 창이 열려 있지 않은 경우에도 VS에서 발생합니다. 또한 ProcessExplorer는 실행 파일이나 실행 파일이있는 디렉토리를 표시하지 않습니다. VS의이 '모드'에서는 실행 파일을 실행할 때만 문제가 발생합니다. 실행하지 않으면 매번 문제없이 빌드 할 수 있습니다.
- 'VS 모드' 와 실행 파일의 디렉토리가 열려있는 탐색기 창 (C # exe로만 테스트 됨)에서 이상하게 나타납니다 .VS가 exe가 다른 프로세스에서 사용되고 있다고 불평하기 때문에 다시 빌드 할 수 없습니다. 그러나 열린 탐색기 창에서 exe를 삭제하면 작동하며 결과적으로 빌드가 성공합니다. 다시 말하지만 ProcessExplorer에는 참조가 없습니다. handle.exe와 내 결과가 일치하는 것 같습니다 (PE와 핸들은 내부적으로 동일한 API를 사용하지 않습니까?)
업데이트 2 그것은 단지 탐색기 일 수는 없습니다 : explorer.exe를 죽인 후에도 VS 문제가 여전히 있습니다.
업데이트 3 Asher에 따르면 Process Monitor를 사용하면 흥미로운 사실을 알 수 있습니다. 탐색기 모드의 경우 디렉토리를 열 때 IRP_MJ_CREATE에 10 번의 호출이 있습니다. 그러나 IRP_MJ_CLEANUP에 대한 9 번의 호출 만 있습니다. 이 모든 호출은 그래서 확실히, Shell32.dll에서 내에서 발생 하지 문제를 설치하는 제 3 자. 그리고 디렉토리를 연 후 정확히 1 분이 지나면 시스템 프로세스 자체가 IRP_MJ_CLEANUP 호출을 발행하고 파일이 해제되고 파일이 삭제됩니다.
그러나 나는 왜 이것이 왜 일어나는지 알 수 없었습니다. 내가 만든 일부 변경으로 인해 발생하는 탐색기 버그입니까?
해결책! 내가 사용할 수있는 서비스를 통해 보면서, 나는에 대한 설명 눈치 응용 프로그램 환경은 말한다, 나는 인용, 응용 프로그램에 대한 응용 프로그램 호환성 캐시 요청을 처리 가 시작 될 때 . 익숙한 것 같습니다. 실제로 서비스를 시작한 후에는 더 이상 문제를 재현 할 수 없으며 ProcMon의 출력이 다르고 짧습니다. 재밌는 것은, 서비스를 다시 중단 한 후에도 모든 것이 여전히 양호하고 procmon의 출력이 여전히 짧기 때문입니다.
나는 두 번째 컴퓨터에서 이것을 시도했는데, 모든 타사 물건이 행복하게 실행되고 여전히 괜찮습니다.
이것이 실제 버그인지 확실하지 않지만 ( '서비스를 비활성화하면 어떤 결과를 기대할 수 있습니까?'), 단순히 서비스를 시작한 다음 다시 중지하여 문제가 해결되는 것은 아닙니다.
바운티는 이것에 대해 더 깊은 통찰력을 제공 할 수있는 누군가에게, 그렇지 않으면 @Asher에게 나를 ProcMon으로 안내하여 결국 올바른 방향으로 인도했습니다.