est la création de fichier atomique dans Windows XP?

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:

  1. Que faire si l’utilisateur n’a pas access à créer ce fichier?
  2. Lorsque votre application plante, le système nettoie les verrous Mutex. Il ne supprimera pas votre fichier pour vous.
  3. Pourquoi introduire la surcharge et le risque de disque IO inutilement? (et je ne suis pas sûr que cela soit possible, mais pendant que le fichier est ouvert, un utilisateur peut le renommer ou le déplacer, non?)
  4. C’est plus de code.

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.

  1. Vérifier le verrou du fichier / existe
  2. Si le fichier est verrouillé, l’autre processus fonctionne
  3. Si le fichier n’existe pas ou n’a pas de verrou, vous pouvez l’acquérir
  4. Ouvrez le fichier en acquérant le verrou

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!