2011-01-27 19 views
9

Duplicar posible:
How do I find out which process is locking a file using .NET?¿Cómo puedo determinar programáticamente qué aplicación está bloqueando un archivo?

Quiero copiar un archivo pero está bloqueado por otra aplicación, por lo que un FileInUseException es lanzada. Me gustaría decirle al usuario qué aplicación está bloqueando el archivo que estoy tratando de copiar. ¿Hay alguna forma en .NET Framework para hacer esto? Sin este conocimiento, estoy recurriendo a decirle a los usuarios que usen la aplicación Unlocker.

+3

Duplicado: http://stackoverflow.com/questions/317071/how-do-i-find-out-which-process-is-locking-a-file-using-net –

+0

¿Pueden las respuestas aquí fusionarse de alguna manera? con la pregunta duplicada? –

+0

No elimine esta pregunta. La otra pregunta puede ser ontológicamente equivalente, pero no coincide con mi búsqueda. Esta pregunta tiene mérito porque admite una ruta de acceso diferente. –

Respuesta

4

Puede probar el código provisto en this question over here, o mirar other suggestions here.

El enfoque general consiste en enumerar los mangos de todos los procesos, obtener las rutas de los archivos de las manijas, y compara con el archivo que le interesa.

Sin embargo, un problema con este enfoque es que incluso si puede determinar que el archivo está bloqueado y la aplicación que tiene el bloqueo de archivo, entonces todavía tendrá que hacer frente a las condiciones de carrera, por ejemplo ...

un milisegundo más tarde

  • el archivo no está bloqueado
  • la aplicación que no mantenga el bloqueo no es ahora

luego dos milisegundos más tarde

  • el archivo está bloqueado (de nuevo)
  • una aplicación diferente tiene el bloqueo

entonces tres milisegundos más tarde

  • el archivo sigue bloqueada
  • otra aplicación tiene la cerradura

... etc

One suggestion es intentar obtener el identificador de archivo en su aplicación, y detectar la excepción cuando se puede' t.

try 
{ 
    using (Stream stream = new FileStream("MyFilename.txt")) 
    { 
    } 
} catch { 
    //check here why it failed and ask user to retry if the file is in use. 
} 

Por supuesto, esto no va a ayudar a identificar al culpable (s), pero al menos tienes una manera más segura de intentar acceder al archivo.

3

Teniendo en cuenta las advertencias Ed señaló, en Vista una posterior, puede utilizar las API de Administrador de reinicio de lograr esto (aunque su aplicación no es un instalador).

Se crea una nueva sesión, se registra el archivo de interés, a continuación, llamar RmGetList para obtener la lista de las aplicaciones o servicios que tienen una manija en el archivo. Debería poder incluso iniciar un reinicio de esas aplicaciones si son conscientes del Restart Manager sin involucrar al usuario.

Claramente, el Administrador de reinicio es una API de Win32, pero usted debe ser capaz de P/Invoke en ella. Este artículo: http://msdn.microsoft.com/en-us/magazine/cc163450.aspx tiene las firmas de P/Invoke necesarias, así como ejemplos de uso de esta manera.

+0

Enlace no funciona. ¿Puedes actualizarlo? – Mardok

+0

@Mardok (y otros): hay una discusión sobre cómo usar Restart Manager aquí: http://stackoverflow.com/questions/1304/how-to-check-for-file-lock – RenniePet

+0

@RenniePet verifica el hilo duplicado - hay una respuesta con el uso de RestartManager API. Funciona mucho mejor. – Mardok

Cuestiones relacionadas