ouvrir le fichier en mode exclusif en C #
Je veux ouvrir un fichier pour lire en mode exclusif, et si le fichier est déjà ouvert par un processus/thread d'autre, je veux recevoir une exception. J'ai essayé le code suivant, mais ne fonctionne pas, même si j'ai ouvert le foo.txt j'pouvez toujours atteindre la Console.WriteLine déclaration. Des idées?
static void Main(string[] args)
{
using (Stream iStream = File.Open("c:\\software\\code.txt", FileMode.Open,
FileAccess.Read, FileShare.None))
{
Console.WriteLine ("I am here");
}
return;
}
source d'informationauteur George2
Vous devez vous connecter pour publier un commentaire.
Ce que vous faites est la bonne chose. Probablement que vous êtes tout simplement de le tester de manière incorrecte. Vous devez l'ouvrir avec un programme qui verrouille le fichier quand il est ouvert. Le bloc-notes ne le ferais pas. Vous pouvez exécuter votre application deux fois pour voir:
Ce que vous avez fait est correct.
Si vous avez besoin, ce sont tous les fichiers déjà ouverts, il y a un moyen de voir par NtQuerySystemInformation
Vous peut se faire 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 étendue à un seul fichier si ouvert ou pas...
FileShare.Aucun ne fonctionnera que si un autre processus a également ouvert le fichier sans lui permettant d'être partagé pour les lectures.
Des programmes tels que le bloc-notes et Visual Studio ne pas verrouiller les fichiers de texte.
Test en écrivant une simple console en mode programme qui ouvre le fichier et puis attend:
Exécuter ce programme à partir de la ligne de commande (ou une autre instance de Visual Studio), puis exécutez votre programme. De cette façon, vous pouvez jouer avec différentes valeurs pour les FileMode et de partage de fichiers pour vous assurer que votre programme réagit correctement dans tous les cas.
Et, non, vous n'avez pas à vérifier pour voir si le fichier est ouvert en premier. Votre code doit lever une exception si le fichier est déjà ouvert. Donc tout ce que vous avez à faire est de gérer cette exception.
Je vous recommande d'utiliser le
FileAccess.ReadWrite
membre car certains fichiers peuvent déjà être ouvert, mais vous permettentRead
d'accès sur le fichier. Cependant, je suppose que dans les conditions exceptionnelles, tous les fichiers ouverts pourRead/Write
accès permettrait pas votre code deWrite
pour le fichier.Bien sûr (comme Mehrdad déjà expliqué), si vous utilisez un éditeur comme le bloc-notes pour ouvrir le fichier de test, vous ne serez pas en mesure de restreindre l'accès parce que le bloc-notes ne permet pas de verrouiller le fichier.