2010-06-07 53 views
16

¿Hay alguna forma de determinar si un archivo ya está abierto o no?Compruebe si un archivo está abierto

+2

Por favor, ofrece más detalles. ¿Ya está abierto por su proceso u otro proceso? ¿Período abierto, o simplemente abierto con acceso de escritura? ¿Qué hay de compartir? etc. Esta pregunta es demasiado vaga. – hemp

Respuesta

26
protected virtual bool IsFileinUse(FileInfo file) 
{ 
    FileStream stream = null; 

    try 
    { 
     stream = file.Open(FileMode.Open, FileAccess.ReadWrite, FileShare.None); 
    } 
    catch (IOException) 
    { 
     //the file is unavailable because it is: 
     //still being written to 
     //or being processed by another thread 
     //or does not exist (has already been processed) 
     return true; 
    } 
    finally 
    { 
     if (stream != null) 
     stream.Close(); 
    } 
    return false; 
} 
+2

Si el proceso no tiene acceso de escritura al archivo, producirá un resultado engañoso (el abierto fallará, pero no necesariamente porque existe un identificador). Abrir para el acceso de lectura sería menos propenso a errores. – hemp

+4

Es sorprendente que la mayoría de los idiomas no tienen un método para probar el archivo está abierto. Solíamos usar el mismo tipo de método en C++ en OS/2. es decir, intente abrir el archivo exclusivo. Funciona bastante bien, pero nunca pensé que fuera elegante. – Matt

+2

No es una función de idioma, es una función de sistema operativo. Simplemente no existe una API simple (en Windows) para consultar esa información. Es posible obtenerlo, pero es de bajo nivel y hay muchos parámetros que deberían especificarse para saber qué se entiende por "abierto". – hemp

7

Como @pranay rana, pero hay que asegurarse de que cerramos nuestro identificador de archivo:

public bool IsFileInUse(string path) 
{ 
    if (string.IsNullOrEmpty(path)) 
    throw new ArgumentException("'path' cannot be null or empty.", "path"); 

    try { 
    using (var stream = new FileStream(path, FileMode.Open, FileAccess.Read)) { } 
    } catch (IOException) { 
    return true; 
    } 

    return false; 
} 
+0

Igual que @pranay rana, probé este método, pero no detecta cuando el archivo está abierto en el Bloc de notas . – James

1

Si quiere decir que usted quiere comprobar si un archivo está abierto antes de intentar abrirlo , entonces no. (Al menos no sin pasar a bajo nivel y examinar todos los identificadores de archivos que están abiertos en el sistema.)

Además, la información sería antigua cuando la obtenga. Incluso si la prueba devuelve que el archivo no está abierto, podría haberse abierto antes de que tenga la oportunidad de usar el valor de retorno.

Por lo tanto, la forma correcta de manejar la situación es intentar abrir el archivo y manejar cualquier error que pueda ocurrir.

0

De acuerdo. Crearía una clase designada que envuelva la lógica de archivo abierto o al menos la prueba (IsFileAvailable). Esto le permitirá colocar la administración de excepciones con una clase específicamente responsable y hacerla reutilizable. Incluso puede aplicar lógica adicional, como probar el tamaño del archivo para ver si el archivo se está escribiendo en etc. para dar una respuesta más detallada. También hará que su código de consumo sea mucho más limpio.

Cuestiones relacionadas