112 votes

Comment puis-je lire un fichier texte sans le verrouiller?

J'ai un windows service écrit son journal dans un fichier texte dans un format simple.

Maintenant, je vais créer une petite application qui permet de lire le service du journal et montre à la fois l'existant et le journal d'ajouter un de vues avec visualisation en direct.

Le problème est que le service verrouille le fichier texte pour ajouter de nouvelles lignes et en même temps l'application de l'observateur d'verrouille le fichier pour la lecture.

Le Code De Service:

void WriteInLog(string logFilePath, data)
{
    File.AppendAllText(logFilePath, 
                       string.Format("{0} : {1}\r\n", DateTime.Now, data));
}

La visionneuse de Code:

int index = 0;
private void Form1_Load(object sender, EventArgs e)
        {
            try
            {
                using (StreamReader sr = new StreamReader(logFilePath))
                {
                    while (sr.Peek() >= 0)  // reading the old data
                    {
                        AddLineToGrid(sr.ReadLine());
                        index++;
                    }
                    sr.Close();
                }

                timer1.Start();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }


private void timer1_Tick(object sender, EventArgs e)
        {
            using (StreamReader sr = new StreamReader(logFilePath))
            {
                // skipping the old data, it has read in the Form1_Load event handler
                for (int i = 0; i < index ; i++) 
                    sr.ReadLine();

                while (sr.Peek() >= 0) // reading the live data if exists
                {
                    string str = sr.ReadLine();
                    if (str != null)
                    {
                        AddLineToGrid(str);
                        index++;
                    }
                }
                sr.Close();
            }
        }

Est-il un problème dans mon code en lecture et en écriture?

Comment résoudre le problème?

142voto

Manfred Points 2625

Vous devez vous assurer que le service et le lecteur ouvrent le fichier journal de manière non exclusive. Essaye ça:

Pour le service, utilisez une instance FileStream créée comme suit:

 var outStream = new FileStream(logfileName, FileMode.Open, 
                               FileAccess.Write, FileShare.ReadWrite);
 

Pour le lecteur, utilisez la même chose mais changez l’accès au fichier:

 var inStream = new FileStream(logfileName, FileMode.Open, 
                              FileAccess.Read, FileShare.ReadWrite);
 

Bonne chance!

33voto

heads5150 Points 3377

Explicite configure le mode de partage lors de la lecture du fichier texte.

 using (FileStream fs = new FileStream(logFilePath, 
                                      FileMode.Open, 
                                      FileAccess.Read,    
                                      FileShare.ReadWrite))
{
    using (StreamReader sr = new StreamReader(fs))
    {
        while (sr.Peek() >= 0) // reading the old data
        {
           AddLineToGrid(sr.ReadLine());
           index++;
        }
    }
}
 

15voto

Yossarian Points 8601
 new StreamReader(File.Open(logFilePath, 
                           FileMode.Open, 
                           FileAccess.Read, 
                           FileShare.ReadWrite))
 

-> cela ne verrouille pas le fichier.

10voto

James Points 40024

Le problème est que lorsque vous écrivez dans le journal, vous verrouillez exclusivement le fichier afin que votre StreamReader ne soit pas autorisé à l'ouvrir du tout.

Vous devez essayer d'ouvrir le fichier en mode lecture seule .

 using (FileStream fs = new FileStream("myLogFile.txt", FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
    using (StreamReader sr = new StreamReader(fs))
    {
        while (!fs.EndOfStream)
        {
            string line = fs.ReadLine();
            // Your code here
        }
    }
}
 

1voto

Tom Gullen Points 20826

Avez-vous essayé de copier le fichier, puis de le lire?

Il suffit de mettre à jour la copie chaque fois que des modifications importantes sont apportées

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X