2017-01-03 26 views
1

Я пытаюсь создать небольшую программу для мониторинга моего pfirewall.log, но я не могу ее открыть. я нашел довольно много (простые) ответы, что все вроде говорятКак контролировать лог-файл, который, кажется, открыт все время (как и блокнот ++)?

// use FilesystemWatcher 
// open FileStream 
// read from last position to end 
// output new lines 

Проблема состоит в следующем: Файл, кажется, всегда будет открыт другим процессом уже. Я предполагаю, что это процесс обработки Windows в файл, поскольку он все время записывается, как показывает «Блокнот ++».

Это означает, что Notepad ++ может по какой-то причине делать то, что я не могу: прочитайте файл, несмотря на то, что он уже открыт.

Я инициализировать мой монитор в конструкторе:

public FirewallLogMonitor(string path) 
    { 
     if (!File.Exists(path)) 
      throw new FileNotFoundException("Logfile not found"); 

     this.file = path; 
     this.lastPosition = 0; 
     this.monitor = new FileSystemWatcher(Path.GetDirectoryName(path), Path.GetFileName(path)); 
     this.monitor.NotifyFilter = NotifyFilters.Size; 

    } 

И попробуйте прочитать файл на monitor.Changed события:

private void LogFileChanged(object sender, FileSystemEventArgs e) 
    { 
     using (FileStream stream = new FileStream(e.FullPath, FileMode.Open, FileAccess.Read, FileShare.Read)) 
     using (StreamReader reader = new StreamReader(stream)) 
     { 
      stream.Seek(this.lastPosition, SeekOrigin.Begin); 
      var newLines = reader.ReadToEnd(); 
      this.lastPosition = stream.Length; 
      var filteredLines = filterLines(newLines); 
      if (filteredLines.Count > 0) 
       NewLinesAvailable(this, filteredLines); 
     } 
    } 

Он всегда бросает IOException на new FileStream(...) сказать мне файл уже используется.

Поскольку Notepad ++ делает это, должен быть способ, которым я тоже могу это сделать, правильно?

** Edit: ** Кнопка делает это:

public void StartLogging() 
    { 
     this.IsRunning = true; 
     this.monitor.Changed += LogFileChanged; 
     this.monitor.EnableRaisingEvents = true; 
    } 

** Edit2: ** Это не дубликат FileMode and FileAccess and IOException: The process cannot access the file 'filename' because it is being used by another process, так что один принимает у меня есть контроль над процессом записи. Попробуем другие предложения и отчитаться с результатами.

+4

'FileShare.Read' означает«позволяет последующее открытие файла для чтения». Если файл уже открыт для записи, это не сработает. Используйте 'FileShare.ReadWrite | FileShare.Delete', чтобы максимально разрешить то, что другие пользователи могут делать с файлом. –

+0

[Что является наименее инвазивным способом чтения заблокированного файла на C# (возможно, в небезопасном режиме)?] (Http://stackoverflow.com/q/3560651/669576) –

+2

Обратите внимание, что после исправления 'FileShare', чтобы исправить ваши исключение, вы будете случайным образом получать исключения из 'var newLines = reader.ReadToEnd()', когда другой процесс, которому принадлежит файл, блокирует его для записи новой строки журнала. Это будет * прерывистым * и зависит от того, когда Windows нужно записать в файл, а это означает, что вы можете пройти недели, прежде чем вы увидите это исключение. Вам нужно «try/catch» и способ восстановления после неудачного чтения. – Quantic

ответ

0

Если я правильно понял ваш вопрос, вы можете использовать Notepad ++ сам с плагином для мониторинга вы должны пойти в:

плагинов -> Document MONITER -> Начать контролировать

если вы не имеете этот плагин вы можете скачать его здесь:

http://sourceforge.net/projects/npp-plugins/files/DocMonitor/

+1

Это не помогает, поскольку я обрабатываю данные перед их показом. Edit: Кроме того, использование notepad ++ само по себе не заставляет меня учиться, как это сделать правильно. – Squirrelkiller