HI, je voudrais utiliser le système de fichiers comme un verrou entre deux processus, sur Windows XP. c’est-à-dire, à partir d’un nom de fichier “file_lock”, un processus acquiert le verrou en essayant de créer le fichier “file_lock” s’il n’existe pas déjà. S’il existe déjà, ne parvient pas à obtenir le verrou.
c’est à dire
FileStream fs=new FileStream("c:\\file_lock, FileMode.CreateNew);
Est-ce que ça va marcher? La création de fichier si le fichier n’existe pas déjà atomique?
Merci!
Oui ça va marcher. Mais pas aussi bien qu’un Mutex pour de nombreuses raisons, notamment:
Comme la question a été étiquetée C #, cette réponse ne s’applique plus, mais j’aimerais la laisser au cas où cela serait utile pour les autres à l’avenir.
Si vous utilisez Java, vous pouvez utiliser java.nio.channels.FileLock
.
Pour l’utiliser, faites quelque chose comme ceci:
import java.io.RandomAccessFile; import java.nio.FileLock; ... RandomAccessFile raf = new RandomAccessFile(file, "rw"); FileLock lock = raf.getChannel().tryLock(0L, Long.MAX_VALUE, false); if (lock != null && lock.isValid()) { // You've acquired the lock! else { // You did not acquire the lock raf.close(); }
Remarque: Cela protège contre les access aux autres processus, mais pas aux autres threads. Vous devrez utiliser votre propre synchronisation interne pour cela (le locking de raf
fonctionnerait probablement).
Si vous souhaitez utiliser le fichier comme verrou de synchronisation, je vous suggère la procédure suivante.
Ce code peut vous aider à rechercher le verrou.
public static bool isFileLocked(ssortingng filename) { if (!File.Exists(filename)) throw new FileNotFoundException("File not found!", filename); FileStream fs = null; try { fs = File.Open(filename, FileMode.Open, FileAccess.ReadWrite, FileShare.None); return false; } catch (IOException) { return true; } catch (Exception) { throw; } finally { if (fs != null) { fs.Close(); fs = null; } } }
HTH!