2010-03-19 17 views
10

¿Hay alguna manera en .Net de averiguar exactamente qué proceso ha bloqueado un archivo?¿Archivo bloqueado por qué proceso?

EDIT: Estoy haciendo esto porque quiero que mi usuario sepa que no puede modificar/abrir el archivo, porque en este momento, otro programa que está usando (como Excel) lo tiene abierto. Con suerte, esto ayuda.

+1

La información sería inútil, porque para cuando haga algo con ella, ya no podría ser precisa. –

+7

¿Realmente Josh? Estás seguro de eso ... – SpaceghostAli

+0

@SpaceghostAli Los archivos siempre se bloquean indefinidamente, ¿no? –

Respuesta

6

La respuesta corta a esto es no.

Sin embargo, la respuesta larga es que hay varias llamadas de API y métodos de WMI que puede utilizar para encontrar esta información, pero no espere que sea rápida y sencilla.

Si desea usar llamadas API, eche un vistazo a la función NtQuerySystemInformation con el parámetro SYSTEM_PROCESS_INFORMATION. Esta es una de esas preciosas métodos "sin papeles" que viene con la maravillosa exención de responsabilidad:

NtQuerySystemInformation puede alterada o no está disponible en futuras versiones de Windows . Las aplicaciones deben usar las funciones alternativas que se enumeran en este tema.

Así que sugeriría evitar eso a favor de usar WMI.

Puede usar la clase WMI Win32_Process para enumerar todos los procesos que se están ejecutando actualmente en la máquina, y luego enumerar todos los identificadores que cada proceso mantiene hasta que encuentre el archivo que está buscando. Desafortunadamente no hay una manera simple de decir "hey, qué proceso está bloqueando este archivo", solo funciona al revés, tiene que buscar en la lista de procesos hasta encontrar el que está bloqueando el archivo que le interesa.

Recomendaría un pequeño artículo sobre CodeProject titulado How To: (Almost) Everything In WMI via C# Part 2: Processes. (La parte 1 también es una buena lectura si le gusta ese tipo de cosas)

0

Parece que alguien ha descubierto éste hacia fuera (y es posible aprender algo de francés, así :))

http://www.axcis.com.au/bb/viewtopic.php?p=505

+0

Eso es archivos activos por proceso. Él está buscando viceversa. –

+0

Es cierto: si no es crítico para el rendimiento, puede enumerar la salida de todos los procesos que buscan el archivo. – holtavolt

+0

Cuando implementé algo como esto para un servidor Novell tuve que hacerlo al revés de esa manera: busque todo lo que busca el archivo. –

1

Bueno ... no es exactamente una manera .NET de hacerlo ... pero suponiendo que solo quieres saber usando una utilidad fácil, mira Handle from SysInternals.

+2

Creo que Irwin está preguntando cómo hacerlo programmacitally, no creo que esto realmente lo ayude con eso. –

+0

@Simon Bueno, técnicamente, podría atrapar la excepción y luego invocar mediante programación esta herramienta de línea de comandos para obtener los procesos que actualmente usan el archivo. Lejos de ideal, sí, pero posible! –

Cuestiones relacionadas