2011-09-09 19 views
22

Duplicar posible:
Wait until file is unlocked in .NETBien y forma limpia que esperar hasta que el archivo se cierra

tengo un archivo abierto, como un .doc o .txt, y tengo que esperar hasta que el usuario lo cierre. ya probar esto, de acuerdo con Wait until file is unlocked in .NET:

while (true) 
{ 
    try 
    { 
     using (FileStream Fs = new FileStream(fileName, FileMode.Open, FileAccess.ReadWrite, FileShare.None, 100)) 
     { 
      //the file is close 
      break; 
     } 
    } 
    catch (IOException) 
    { 
     //wait and retry 
     Thread.Sleep(1000); 
    } 
} 

Esto funciona bien, pero puede ser posible encontrar una solución sin un try/catch y tratantes de la excepción?

+3

Esta es una muy buena pregunta. – TIHan

+0

Desafortunadamente, no se puede, en general. – SLaks

+4

Ya hay una pregunta para esto, incluso has publicado un enlace, así que si esa es la respuesta, esa es la respuesta. Es una lástima que no haya una manera limpia, sin embargo. – Ryan

Respuesta

8

Desafortunadamente no, no hay otra manera.

La API no tiene un evento que se activará cuando se desbloquee un archivo o cualquier otra cosa que sea conveniente.

Reintentar con espera es la mejor solución con la API actual.

+0

Aunque puede que tenga toda la razón, todavía me pregunto cómo el Explorador de procesos de Mark Russinovich logra mostrar los identificadores abiertos del proceso casi en tiempo real. ¿Lo hace también mediante encuestas frecuentes? Trataré de resolver esto, y si encuentro algo útil, publicaré mi respuesta aquí. –

+0

@Igor - No está utilizando el código administrado. No sé qué expone la API de Windows (y podría estar usando las características _undocumented_). – Oded

+2

Sure Mark está utilizando API no gestionada de bajo nivel (¡o incluso carga dinámicamente el controlador kernel!), Pero el OP no dice que el problema deba resolverse utilizando solo la API administrada. Es realmente interesante para mí (y para muchos otros, apuesto) cómo hacerlo sin un enfoque de espera y ciclo. –

2

Para una, sin embargo, no use el bucle que tiene ahora, break ing si no hay ninguna excepción - realice su acceso al archivo real en ese bucle using.

A continuación, si el archivo está abierto en un proceso conocido, usted podría conseguir su objeto Process, establece EnableRaisingEvents a true, y manejar su caso Exited para volver a intentarlo. Sin embargo, no es a prueba de fallas, por lo que aún manejaría excepciones y usaría un bucle.

0

Puede realizar llamadas P/Invoke a la función CreateFile nativa y luego analizar el código de error. Sin embargo, try/catch seguirá siendo necesario.

Cuestiones relacionadas