ouvrir le fichier en mode exclusif en C #

Je veux ouvrir un fichier à lire en mode exclusif, et si le fichier est déjà ouvert par un processus / thread autre, je veux recevoir une exception. J’ai essayé le code suivant, mais ne fonctionne pas, même si j’ai ouvert le fichier foo.txt, je peux toujours atteindre l’instruction Console.WriteLine. Des idées?

static void Main(ssortingng[] args) { using (Stream iStream = File.Open("c:\\software\\code.txt", FileMode.Open, FileAccess.Read, FileShare.None)) { Console.WriteLine ("I am here"); } return; } 

Ce que vous faites est la bonne chose. Vous le testez probablement de manière incorrecte. Vous devriez l’ouvrir avec un programme qui verrouille le fichier lorsqu’il est ouvert . Bloc-notes ne ferait pas. Vous pouvez exécuter votre application deux fois pour voir:

 static void Main(ssortingng[] args) { // Make sure test.txt exists before running. Run this app twice to see. File.Open("test.txt", FileMode.Open, FileAccess.Read, FileShare.None); Console.ReadKey(); } 

Ce que vous avez fait est correct.

Si vous avez besoin de ce que tous les fichiers sont déjà ouverts, il existe un moyen de voir par NtQuerySystemInformation

Vous pouvez avoir une idée de http://www.codeproject.com/KB/shell/OpenedFileFinder.aspx

qui obtient tous les fichiers ouverts dans un répertoire .. qui peut être étendu à un seul fichier, qu’il soit ouvert ou non …

FileShare.None ne fonctionnera que si un autre processus a également ouvert le fichier sans lui permettre d’être partagé pour les lectures.

Des programmes tels que Notepad et Visual Studio ne verrouillent pas les fichiers texte.

Testez-le en écrivant un programme en mode console simple qui ouvre le fichier et attend ensuite:

 static void Main(ssortingng args[]) { using (FileStream f = File.Open("c:\\software\\code.txt", FileMode.Open, FileAccess.Read, FileShare.None)) { Console.Write("File is open. Press Enter when done."); Console.ReadLine(); } } 

Exécutez ce programme à partir de la ligne de commande (ou d’une autre instance de Visual Studio), puis exécutez votre programme. De cette façon, vous pouvez jouer avec différentes valeurs pour FileMode et FileShare afin de vous assurer que votre programme réagit correctement dans tous les cas.

Et non, vous n’avez pas à vérifier si le fichier est ouvert en premier. Votre code devrait générer une exception si le fichier est déjà ouvert. Donc, tout ce que vous avez à faire est de gérer cette exception.

Je suggérerais d’utiliser le membre FileAccess.ReadWrite car certains fichiers sont peut-être déjà ouverts mais vous permettent un access en Read sur le fichier. Cependant, je suppose que dans des conditions non exceptionnelles, tous les fichiers ouverts pour un access en Read/Write ne permettraient pas à votre code d’ Write dans le fichier.

Bien sûr (comme Mehrdad l’a déjà expliqué), si vous utilisez un éditeur tel que Notepad pour ouvrir le fichier à titre de test, vous ne pourrez pas restreindre l’access, car Notepad ne verrouille pas du tout le fichier.