2015-09-22 5 views
0

Это мой рабочий код. У меня есть файловый менеджер, который отслеживает мой файл журнала, когда файл обновляется (он много обновляет) он читает журнал и выводит строки, соответствующие регулярному выражению, на текстовое окно. Проблема заключается в том, что он читает файл с самого начала и снова печатает строки с регулярным выражением, поэтому я получаю повторяющиеся данные в текстовом поле. Я также не знаю, правильно ли я настроил его для запуска файла, прочитанного из отдельного потока, поэтому моя программа не «замораживается» при чтении больших файлов журнала.Прочитать файл журнала из последней прочитанной позиции

private void btnStart_Click(object sender, EventArgs e) 
{ 
    if ((Properties.Settings.Default.setting_logfile != "") && (Properties.Settings.Default.setting_logfolder != "")) 
    { 
     if (btnStart.Text == "Start Parsing") 
     { 
      // change text on button and switch status image 
      btnStart.Text = "Stop Parsing"; 
      pbStatus.Image = Properties.Resources.online; 

      new Thread(() => Run()).Start(); 
     } 
     else 
     { 
      btnStart.Text = "Start Parsing"; 
      pbStatus.Image = Properties.Resources.offline; 
      fsWatcher.EnableRaisingEvents = false; 
     } 
    } 
    else 
    { 
     tbOutput.Text = "Please select a log file to parse."; 
    } 
} 

private void Run() 
{ 
    try 
    { 
     fsWatcher.Changed += new FileSystemEventHandler(OnChanged); 
     fsWatcher.EnableRaisingEvents = true; 
    } 
    catch (Exception ex) 
    { 
     MessageBox.Show("An error occurred: " + ex.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error); 
    } 
} 

private void OnChanged(object source, FileSystemEventArgs e) 
{ 
    string line; 

    Regex pattern = new Regex(@"\[[\w :]+\]\s<SYSTEMWIDE_MESSAGE>:"); 

    Stream stream = File.Open(e.FullPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite); 
    StreamReader streamReader = new StreamReader(stream); 

    while ((line = streamReader.ReadLine()) != null) 
    { 
     Match match = pattern.Match(line); 
     if (match.Success) 
     { 
      tbOutput.AppendText(line + "\r\n"); 
     } 
    } 
    streamReader.Close(); 
    stream.Close(); 
} 
+0

Этот код не будет работать, потому что вы обращаетесь к 'tbOutput' (который я предполагаю, что это' TextBox' из thhread не-UI. –

+0

Код выше работ, у меня есть это работает – Manvaril

ответ

1

Вы можете вспомнить последнюю позицию, в которую вы читали, и начать с нее.

Regex pattern = new Regex(@"\[[\w :]+\]\s<SYSTEMWIDE_MESSAGE>:"); 
long lastPosition = 0; 

private void OnChanged(object source, FileSystemEventArgs e) 
{ 
    string line; 


    Stream stream = File.Open(e.FullPath, FileMode.Open, FileAccess.Read,  FileShare.ReadWrite); 
    stream.Seek(lastPosition, SeekOrigin.Begin); 
    StreamReader streamReader = new StreamReader(stream); 

    while ((line = streamReader.ReadLine()) != null) 
    { 
     if (pattern.Match(line).Success) 
     { 
     tbOutput.AppendText(line + Environment.NewLine); 
     } 
    } 
    lastPosition = stream.Position; // may need to subtract 1!!! 
    streamReader.Close(); 
    stream.Close(); 
} 
Смежные вопросы