Question

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

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<string> sessions = new List<string>();

        using(StreamReader stRead = new StreamReader(openFileDialog1.FileName,Encoding.Unicode))
        {
            while(!stRead.EndOfStream)
            {
                string line = stRead.ReadLine();
                if(line.Contains("Session start"))
                {
                    countStarts++;
                    sessions.Add(line.Substring(line.IndexOf("["), line.LastIndexOf("]") - line.IndexOf("[")));
                }
                if (line.Contains("Session end"))
                {
                    countEnds++;
                    sessions.Remove(line.Substring(line.IndexOf("["), line.LastIndexOf("]") - line.IndexOf("[")));
                }
            }
        }

        txtStarts.Text = countStarts.ToString();
        txtEnds.Text = countEnds.ToString();
        txtDifference.Text = (countStarts - countEnds).ToString();

        listBox1.DataSource = sessions;
    }
Était-ce utile?

La solution

Vous pouvez transmettre 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)) {
}

Autres conseils

Si je voulais ajouter un peu de contexte, StreamReader ne verrouille pas un fichier en vue de la lecture de uniquement pour l'écriture lors de la lecture. Regardez 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. Cependant, même si cet indicateur est spécifié, des autorisations 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 ce   n’est pas spécifié, toute demande d’ouverture du fichier en lecture ou   l'écriture (par ce processus ou un autre processus) échouera jusqu'à ce que le fichier   est fermé. Cependant, même si cet indicateur est spécifié, des   des autorisations peuvent encore être nécessaires pour accéder au fichier.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top