He visto varias respuestas sobre el uso de Handle o Process Monitor , pero me gustaría poder averiguar en mi propio código (C #) qué proceso está bloqueando un archivo.
Tengo la desagradable sensación de que voy a tener que dar vueltas en la API win32, pero si alguien ya ha hecho esto y puede ponerme en el camino correcto, realmente agradecería la ayuda.
Actualizar
Enlaces a preguntas similares
c#
file-locking
AJ
fuente
fuente
Respuestas:
Una de las ventajas
handle.exe
es que puede ejecutarlo como un subproceso y analizar la salida.Hacemos esto en nuestro script de implementación: funciona de maravilla.
fuente
Hace mucho tiempo era imposible obtener de manera confiable la lista de procesos que bloquean un archivo porque Windows simplemente no rastreó esa información. Para admitir la API de Restart Manager , ahora se realiza un seguimiento de esa información.
Arme el código que toma la ruta de un archivo y devuelve uno
List<Process>
de todos los procesos que están bloqueando ese archivo.Uso de permiso limitado (por ejemplo, IIS)
Esta llamada accede al registro. Si el proceso no tiene permiso para hacerlo, obtendrá ERROR_WRITE_FAULT, que significa
An operation was unable to read or write to the registry
. Usted podría conceder el permiso de forma selectiva a su cuenta restringida a la parte necesaria para el registro. Sin embargo, es más seguro que su proceso de acceso limitado establezca un indicador (por ejemplo, en la base de datos o el sistema de archivos, o mediante el uso de un mecanismo de comunicación entre procesos, como cola o canalización con nombre) y que un segundo proceso llame a la API del Administrador de reinicio.Otorgar permisos distintos al mínimo para el usuario de IIS es un riesgo de seguridad.
fuente
tasklist /m YourDllName.dll
y analizar la salida. Ver stackoverflow.com/questions/152506/…Es muy complejo invocar Win32 desde C #.
Debe usar la herramienta Handle.exe .
Después de eso, su código C # debe ser el siguiente:
fuente
/accepteula
. He actualizado la respuesta de Gennady con el cambio.handle.exe
Tuve problemas con la solución de stefan . A continuación se muestra una versión modificada que parece funcionar bien.
ACTUALIZAR
Si solo desea saber qué procesos están bloqueando una DLL en particular, puede ejecutar y analizar la salida de
tasklist /m YourDllName.dll
. Funciona en Windows XP y versiones posteriores. Ver¿Qué hace esto? lista de tareas / m "mscor *"
fuente
myProcessArray
es un miembro de la clase (pero también regresó de getFileProcesses ()? Lo mismo ocurremyProcess
.)Esto funciona para archivos DLL bloqueados por otros procesos. Esta rutina no descubrirá, por ejemplo, que un archivo de texto está bloqueado por un proceso de texto.
C#:
VB.Net:
fuente
más simple con linq:
fuente