¿Puedo usar el constructor FileStream
para asegurar que solo un proceso tenga acceso a un archivo a la vez? ¿Funcionará el siguiente código?¿Puedo usar FileStream para implementar un bloqueo de archivos?
public static IDisposable AcquireFileLock() {
IDisposable lockObj;
do {
// spinlock - continually try to open the file until we succeed
lockObj = TryOpenLockFile();
// sleep for a little bit to let someone else have a go if we fail
if (lockObj == null) Thread.Sleep(100);
}
while (lockObj == null);
return lockObj;
}
private static FileStream TryOpenLockFile() {
try {
return new FileStream(s_LockFileName, FileMode.Create, FileAccess.Read, FileShare.None);
}
catch (IOException) {
return null;
}
}
En particular, es el comportamiento con FileMode.Create
WRT atómica otros procesos? ¿Hay algo más que deba usar?
EDITAR: para ser más específicos, esto es en Microsoft CLR utilizando archivos locales en una sola máquina.
¡Esto se ve bien! ¿Quién limpia el archivo de bloqueo? Probablemente no exista ninguna necesidad funcional de hacerlo ya que la invocación del controlador 'FileStream' siempre sobrescribe el archivo de bloqueo existente. –
Para la limpieza, siempre puedo 'intentar {File.Delete (...)}' e ignorar cualquier excepción (ya que eso significa que otro proceso ha tomado el bloqueo mientras tanto) ... – thecoop