Desde que comencé a usar Windows 7, este problema me ha estado molestando. De vez en cuando veo preguntas similares surgiendo en foros misceláneos, pero nunca vi una respuesta. Aquí hay dos escenarios que casi siempre lo reproducen:
El camino explorador
- Con el explorador, navegue a un directorio que contenga al menos un archivo exe
- Sube un directorio de inmediato
- Eliminar el directorio que acaba de navegar a
- Rendimiento Acceso a carpeta Diálogo denegado que indica que necesita permiso para realizar esta acción Requiere permiso de los administradores para realizar cambios en esta carpeta , con los botones intentar nuevamente y cancelar
- Golpear Try Again nunca funciona de inmediato. Esperar un minuto más o menos y luego hacer clic nuevamente funciona
Nota: Si en el paso 2 y espera un minuto o más antes de subir un directorio, el problema no ocurre y la carpeta se puede eliminar
La forma de Visual Studio
- Cree un proyecto que produzca un archivo exe
- ejecuta el ejecutable y luego ciérralo
- Inmediatamente construya el proyecto nuevamente (cambiando un solo carácter en un archivo fuente, por ejemplo)
- Produce el error fatal LNK1168: no se puede abrir /path/to/the.exe para escribir
Nota: Si en el paso 2 y espera un minuto o más antes de volver a construir, el problema no se produce.
Algunas especificaciones
- Sucede tanto en Windows 7 32 y 64 bit, con VS2008 / 2010/2011
- Sucede en 3 máquinas diferentes.
- No tengo un antivirus de ningún tipo
- Tengo un montón de servicios deshabilitados, pero nada que impida que Windows se ejecute normalmente, UAC también está deshabilitado
- Sucede en cualquier tipo de disco
- Siempre uso una cuenta de usuario que está en el grupo Administradores
Obviamente, ambos escenarios son muy similares y extremadamente reproducibles. Así que pensé que algún proceso debe tener el archivo abierto por alguna razón, y liberarlo nuevamente más tarde. Sin embargo, el uso de sysinternals
handle -a
el archivo exe en cuestión nunca aparece. (esa es la forma correcta de usar handle, ¿verdad?) Entonces, mientras que Explorer / VS informan que no pueden acceder al archivo, handle.exe dice que no está en uso en ninguna parte. Esto me deja bastante despistado, así que me pregunto si alguien puede encontrar una solución: ¿por qué sucede esto y cómo resolverlo?
Actualización en respuesta a las preguntas formuladas:
- No pude reproducir el problema en modo seguro
- Hay un montón de extensiones de shell instaladas. Desde SellExView, aquí están los que no son de Microsoft que son comunes a todas las máquinas: NitroPDF, WinRAR, TortoiseGit, TortoiseSvn, NVidia. Los Tortoise me parecen más sospechosos, aunque para ambos la opción 'Caché de estado' está configurada en 'Caché de estado solo para una carpeta, no hay superposiciones recursivas', es decir, no se está ejecutando TortoiseCache.exe.
- Con el problema del explorador, ProcessExplorer no muestra el ejecutable. Sin embargo, muestra el directorio del ejecutable, pero sigue mostrándolo incluso después de que se eliminó, por lo que parece que no está realmente relacionado
- Con el problema de VS, sucede con VS incluso cuando no hay una ventana de explorador abierta en el directorio de destino. Y nuevamente, ProcessExplorer no muestra el ejecutable, ni el directorio en el que se encuentra el ejecutable. Tenga en cuenta que en este 'modo' con VS, el problema solo ocurre cuando se ejecuta el ejecutable. Si no lo estoy ejecutando, puedo construirlo sin problemas una y otra vez.
- En 'modo VS' y una ventana del explorador abierta en el directorio del ejecutable (probado solo con un exe de C #), se vuelve más extraño: no puedo construir de nuevo porque VS se queja de que otro proceso está utilizando el exe. Sin embargo, si elimino el exe de la ventana abierta del explorador, esto funciona y, en consecuencia, la construcción tiene éxito. Nuevamente, no hay referencias en ProcessExplorer en absoluto. ¿Qué parece coincidir con mis hallazgos con handle.exe (de todos modos, ¿PE y handle no usan la misma API internamente?)
Actualización 2 No puede ser solo el explorador: después de matar a explorer.exe, el problema VS sigue ahí.
La actualización 3 usando Process Monitor como sugiere Asher revela hechos interesantes: para el modo explorador, hay 10 llamadas a IRP_MJ_CREATE al abrir el directorio. Sin embargo, solo 9 llamadas a IRP_MJ_CLEANUP. Todas estas llamadas se originan dentro de shell32.dll, por lo que definitivamente no es un problema de instalación de terceros. Y obviamente es el que falta IRP_MJ_CLEANUP el que causa el problema: exactamente 1 minuto después de abrir el directorio, el proceso del Sistema emite la llamada IRP_MJ_CLEANUP y el archivo se libera y se elimina.
Sin embargo, todavía no podía entender por qué sucede esto. ¿Es un error del explorador provocado por algún cambio que hice?
¡Solución! Mirando a través de los servicios que he desactivado, noté que la descripción de Application Experience dice, y cito, Procesa las solicitudes de caché de compatibilidad de aplicaciones para las aplicaciones a medida que se lanzan . Suena familiar. Y, de hecho, después de iniciar el servicio, ya no puedo reproducir ninguno de los problemas y la salida de ProcMon es diferente y más corta. Sin embargo, es curioso, porque después de detener el servicio nuevamente, todo sigue bien y la salida de procmon es aún más corta.
Probé esto en dos máquinas, con todas las cosas de terceros funcionando felizmente y todo sigue bien.
No estoy seguro de si se trata de un error real (se podría decir 'qué espera con la desactivación de servicios'), pero no es exactamente normal que el problema desaparezca simplemente al iniciar un servicio y luego detenerlo nuevamente.
Bounty se dirige a cualquiera que pueda proporcionar una visión más profunda de esto, sino a @Asher por señalarme a ProcMon que finalmente me llevó en la dirección correcta.