2016-09-12 13 views
0

У меня есть простое приложение, которое позволяет назвать его «X», который запускает внешнюю программу «Y», используя System.Diagnostic.Process.Application «Y» while выполнение записи журнала приложения в текстовый файл.Как написать собственный журнал в richtextbox из файла журнала, созданного внешней программой в C#

Теперь я хочу прочитать это приложение «Y», и если журнал содержит несколько слов, которые трудно для пользователя сделать, и заменить их на мои собственные слова и добавить их в богатое текстовое поле. Мой текущий код выглядит следующим образом и присоединяет слова, как они написаны в логфайл

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(); 
     } 
    } 

Файл журнала сам гласит

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

Теперь я хотел бы заменить каждую строку выше с моими собственными пользовательскими словами

Я пытался что-то вроде этого

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"; 
      }..... 

Остаток if продолжается, но этот код входит в цикл печати одной первой строки

пожалуйста, никаких манипуляций?

Заранее спасибо

ответ

0

Изменить код следующим образом:

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

Его очень печально, что ничего не придумали в RichTextBox, используя свой собственный код rtbLog.Text = ул; был прокомментирован и из кода! –

+0

Можете ли вы обновить код до того, который вы используете в своем приложении, чтобы я мог посмотреть. –

+0

Обновленный код читается следующим образом: http://pastebin.com/93XxnF77 –

0

Вы не должны добавить текст SelectedText, но только установить его значение: Вместо

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

сделать

rtbLog.SelectedText= "Application engine Started"; 

И так далее.

Еще один комментарий, хотя и не относится к вопросу, попробуйте использовать шаблон использования с потоками.

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

Чтение файла журнала построчно, как делает следующий код, решает проблему, хотя не является оптимальной производительности мудрым.

Вы можете рассматривать обработку всего потока как строку сразу (как вы уже сделали) и сопоставление шаблонов с использованием регулярных выражений, если формат файла журнала относительно прост.

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

Да, вы правы «используя» ключевое слово не всегда требует от вас использования функции close(); и распоряжаться(); которые являются нижней частью кода. однако вы предлагаете про чтение журнала не работает –