2016-09-12 2 views
0

J'ai l'application simple nommons-le "X" qui lance le programme externe "Y" en utilisant System.Diagnostic.Process.Application "Y" l'exécution écrit le journal d'application dans le fichier texte.comment écrire un journal personnalisé à richtextbox à partir d'un fichier journal créé par un programme externe en C#

Maintenant, je veux lire cette application "Y" journal et si le journal contient des mots qui sont difficiles à l'utilisateur à entepret et les remplacer par mes propres mots et les ajouter à la zone de texte enrichi. Mon code actuel se lit comme suit et ajoute les mots comme ils sont écrits dans le fichier journal

private void timerLog_Tick(object sender, EventArgs e) 
    { 
     //logpath is the path to that log file 
     if (File.Exists(logpath)) 
     { 
      Stream stream = File.Open(logpath, FileMode.Open,FileAccess.Read, FileShare.ReadWrite); 
      StreamReader streamReader = new StreamReader(stream); 
      string str = streamReader.ReadToEnd(); 

      //rtblog is my RichTextBox 
      rtbLog.Text = str; 
      rtbLog.SelectionStart = rtbLog.Text.Length; 
      rtbLog.ScrollToCaret(); 


      streamReader.Close(); 
      stream.Close(); 
     } 
    } 

Le fichier journal se lit comme suit

Mon Sep 12 19:22:56 2016 Application engine version 2.0.2016 was initiated Mon Sep 12 19:22:56 2016 Windows version 6.2 (Windows 8 or greater) Mon Sep 12 19:22:56 2016 System: 64 bits system Mon Sep 12 19:22:56 2016 checking application drivers Mon Sep 12 19:22:56 2016 Drivers not found Mon Sep 12 19:22:56 2016 Attempting to perform a task Mon Sep 12 19:22:56 2016 The task failed Mon Sep 12 19:22:56 2016 Process failed,The program is exiting

Maintenant, je voudrais remplacer chaque ligne ci-dessus avec mes propres mots personnalisés

J'ai essayé quelque chose comme ça

if (str.LastIndexOf("Application engine version 2.0.2016 was initiated")>0) 
      { 
       rtbLog.SelectedText= rtbLog.SelectedText+"Application engine Started"; 
      } 
      else if (str.LastIndexOf("Drivers not found")>0) 
      { 
       rtbLog.SelectedText= rtbLog.SelectedText+"Drivers were not found navigate to settings Menu to install them"; 
      }..... 

L'autre si continue, mais ce code entre dans une boucle d'impression d'une seule première ligne

s'il vous plaît des manipulations?

Merci à l'avance

Répondre

0

Code Modifier comme suit:

if (File.Exists(logpath)) 
     { 
      Stream stream = File.Open(logpath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); 
      StreamReader streamReader = new StreamReader(stream); 
      StringBuilder newString = new StringBuilder(); 

      while (!streamReader.EndOfStream) 
      { 
       string str = streamReader.ReadLine(); 

       if (str.LastIndexOf("Application engine version 2.0.2016 was initiated") > 0) 
       { 
        str = "Application engine Started"; 
       } 
       else if (str.LastIndexOf("Drivers not found") > 0) 
       { 
        str = "Drivers were not found navigate to settings Menu to install them"; 
       } 

       newString.AppendLine(str); 
      } 
      rtbLog.Text = newString.ToString(); 
      rtbLog.ScrollToCaret(); 


      streamReader.Close(); 
      stream.Close(); 
     } 
.... 
+0

Il est très triste que rien est venu dans le richtextbox en utilisant votre propre code rtbLog.Text = str; a été commenté à partir du code aussi! –

+0

Pouvez-vous mettre à jour le code à celui que vous utilisez dans votre application afin que je puisse jeter un coup d'oeil. –

+0

Le code mis à jour se lit comme ceci http://pastebin.com/93XxnF77 –

0

Vous ne devriez pas ajouter du texte à SelectedText mais juste définir sa valeur: Au lieu de

rtbLog.SelectedText= rtbLog.SelectedText+"Application engine Started"; 

faire

rtbLog.SelectedText= "Application engine Started"; 

Et ainsi de suite. Un autre commentaire, bien que non pertinent à la question, essaie d'utiliser le modèle using avec les flux.

using (StreamReader streamReader = new StreamReader(logpath)) 
{ 
... 
} 

Lecture de la ligne de fichier journal en ligne, comme le code suivant ne résout votre problème, bien que n'est pas sage des performances optimales.

Vous pouvez envisager de traiter l'ensemble du flux comme une chaîne à la fois (comme vous l'avez déjà fait) et de faire correspondre les modèles en utilisant des expressions régulières si le format du fichier journal est relativement simple.

using (StreamReader streamReader = new StreamReader(logpath)) 
    { 
     string line; 
     while ((line = streamReader.ReadLine()) != null) 
     { 
      if (line.LastIndexOf("Application engine version 2.0.2016 was initiated") > 0) 
      { 
       richTextBox1.SelectedText = "Application engine Started\n"; 
      } 
      else if (line.LastIndexOf("Drivers not found") > 0) 
      { 
       richTextBox1.SelectedText = "Drivers were not found navigate to settings Menu to install them\n"; 
      } 
     } 
    } 
+0

Oui, vous avez raison "using" mot-clé ne vous oblige pas toujours à utiliser close(); et disposer(); qui sont le bas du code. Cependant, votre suggestion sur la lecture du journal ne fonctionne pas –