Puis-je empêcher un StreamReader de verrouiller un fichier texte pendant son utilisation?

StreamReader verrouille un fichier texte pendant sa lecture.
Puis-je forcer le StreamReader à fonctionner en mode “lecture seule” ou “non verrouillable”?

Ma solution consiste à copier le fichier dans un emplacement temporaire et à le lire à partir de là, mais je préférerais utiliser le StreamReader directement si possible. Des suggestions alternatives?

Contexte:
J’ai écrit une petite application pour obtenir des statistiques dans un fichier journal. Ce fichier est mis à jour en permanence (plusieurs fois par seconde) par un programme extérieur, permettant d’appeler AAXXYY.

L’examen de la sortie suggère que mon application peut verrouiller le fichier et empêcher AAXXYY d’écrire.

C’est ce que je fais

private void btnGetStats_Click(object sender, EventArgs e) { int countStarts = 0; int countEnds = 0; IList sessions = new List(); using(StreamReader stRead = new StreamReader(openFileDialog1.FileName,Encoding.Unicode)) { while(!stRead.EndOfStream) { ssortingng line = stRead.ReadLine(); if(line.Contains("Session start")) { countStarts++; sessions.Add(line.Subssortingng(line.IndexOf("["), line.LastIndexOf("]") - line.IndexOf("["))); } if (line.Contains("Session end")) { countEnds++; sessions.Remove(line.Subssortingng(line.IndexOf("["), line.LastIndexOf("]") - line.IndexOf("["))); } } } txtStarts.Text = countStarts.ToSsortingng(); txtEnds.Text = countEnds.ToSsortingng(); txtDifference.Text = (countStarts - countEnds).ToSsortingng(); listBox1.DataSource = sessions; } 

Vous pouvez passer un FileStream à StreamReader et créer le FileStream avec la valeur FileShare appropriée. Par exemple:

 using (var file = new FileStream (openFileDialog1.FileName, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) using (var reader = new StreamReader (file, Encoding.Unicode)) { } 

Bien que j’ajoute un peu de contexte, StreamReader ne verrouille pas un fichier en lecture uniquement pour écrire ce qu’il est en train de lire. Consultez le code ci-dessous de la classe StreamReader.

  new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, FileOptions.SequentialScan); 

Notez le paramètre FileAccess.Read par défaut utilisé pour MSDN http://msdn.microsoft.com/en-us/library/system.io.fileshare.aspx

Permet l’ouverture ultérieure du fichier en lecture. Si cet indicateur n’est pas spécifié, toute demande d’ouverture du fichier en lecture (par ce processus ou un autre processus) échouera jusqu’à la fermeture du fichier. Toutefois, même si cet indicateur est spécifié, des permissions supplémentaires peuvent toujours être nécessaires pour accéder au fichier.

Encore une fois extrait de MSDN pour permettre la lecture et l’écriture, utilisez plutôt FileAccess.ReadWrite (comme suggéré par Jb Evain).

Permet l’ouverture ultérieure du fichier en lecture ou en écriture. Si cet indicateur n’est pas spécifié, toute demande d’ouverture du fichier en lecture ou en écriture (par ce processus ou un autre processus) échouera jusqu’à la fermeture du fichier. Toutefois, même si cet indicateur est spécifié, des permissions supplémentaires peuvent toujours être nécessaires pour accéder au fichier.