c# - Detectando si un archivo está bloqueado por otro proceso(o incluso el mismo proceso)
.net (4)
No es necesario primero verificar si el archivo está bloqueado y luego acceder a él, ya que entre el cheque y el acceso algunos otros procesos pueden tener un bloqueo en el archivo. Entonces, lo que haces es correcto, si tienes éxito, haz tu trabajo con el archivo.
Esta pregunta ya tiene una respuesta aquí:
- ¿Cómo verificar el bloqueo de archivos? [duplicado] 12 respuestas
Así es como lo hago en este momento. Intento abrir el archivo con FileShare configurado en none. Entonces quiero acceso exclusivo al archivo. Si no puedo obtener eso, entonces es una buena apuesta que alguien más tenga el archivo bloqueado.
Tiene que haber una manera mejor y más rápida. ¿Algunas ideas?
try
{
using (FileStream fs = File.Open(GetLockFilename(), FileMode.Open, FileAccess.ReadWrite, FileShare.None))
{
fs.Close();
}
// The file is not locked
}
catch (Exception)
{
// The file is locked
}
No, que yo sepa, no hay una llamada para verificar si el archivo está en uso; debe intentar abrirlo y manejar la excepción mientras lo hace. Otro problema es que es difícil distinguir entre el uso y el no acceso permitido.
La verdad es que, incluso si encuentra una forma de verificar si el archivo está "bloqueado" para cuando llegue a la siguiente línea donde abre el archivo, otra cosa en el sistema operativo puede intentar obtener ese archivo , y su código para abrirlo fallará de todos modos. Tendrás que probar / atrapar allí de todos modos. Por lo tanto, digo que no. Realmente no hay una mejor solución.
Para responder a su pregunta, sería más eficiente escribir el siguiente método de extensión para la clase FileInfo:
public static bool IsLocked(this FileInfo f)
{
try
{
string fpath = f.FullName;
FileStream fs = File.OpenWrite(fpath);
fs.Close();
return false;
}
catch (Exception) { return true; }
}
Una vez que haya creado el método, puede hacer una comprobación rápida como esta:
FileInfo fi = new FileInfo(@"C:/4067918.TIF");
if (!fi.IsLocked()) { //DO SOMETHING HERE; }