miércoles, 21 de mayo de 2008

Memorias de un programador... hoy: File.islocked()

No busqueis entre las librerias de .NET... esa función no existe. Una función que nos indique si un fichero esta bloqueado por otro proceso no existe dentro de System.IO.File, y muchos pensareis, ¿para que coño la quieres?.

Pensar en concurrencia, pensar en distintos procesos en distintos programas que necesitan leer ficheros, y que uno de esos procesos, este escrito en un lenguaje que no diferencia entre "Read", "Write" ni la madre que lo pario.

Entonces este programa escrito en un lenguaje que tendría que se sacrificado en una hoguera, cada vez que lee o escribe un fichero, lo deja bloqueado hasta que se acuerda que lo tiene pillado.

Bueno, veamos que nos ofrece la .NET (v2) para detectar y evitar dicho problema. NADA... Joder, asi que toca hacer una ñapa o programarlo como dios manda (isLocked, estaria bien)... con lo que queda algo asín:


public static bool isLocked(string ruta)
{
StreamReader st;
bool lockedDAT = true;

// Este bucle nos permite esperar a que el modulo fortran logre
// escribir el fichero DAT, antes de que nosotros tratemos de abrirlo.
// Con ficheros muy grandes puede pasar que de errores.

try
{
st = new StreamReader(File.Open(ruta, FileMode.Open, FileAccess.Read));
st.Close();
lockedDAT = false;
}
catch
{
Console.Out.WriteLine("Postproceso: Fichero DAT bloqueado");
lockedDAT = true;
}
return locketDAT;


¿A que mola la ñapa?

No hay comentarios: