Я пытаюсь создать небольшую программу для мониторинга моего 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, так что один принимает у меня есть контроль над процессом записи. Попробуем другие предложения и отчитаться с результатами.
'FileShare.Read' означает«позволяет последующее открытие файла для чтения». Если файл уже открыт для записи, это не сработает. Используйте 'FileShare.ReadWrite | FileShare.Delete', чтобы максимально разрешить то, что другие пользователи могут делать с файлом. –
[Что является наименее инвазивным способом чтения заблокированного файла на C# (возможно, в небезопасном режиме)?] (Http://stackoverflow.com/q/3560651/669576) –
Обратите внимание, что после исправления 'FileShare', чтобы исправить ваши исключение, вы будете случайным образом получать исключения из 'var newLines = reader.ReadToEnd()', когда другой процесс, которому принадлежит файл, блокирует его для записи новой строки журнала. Это будет * прерывистым * и зависит от того, когда Windows нужно записать в файл, а это означает, что вы можете пройти недели, прежде чем вы увидите это исключение. Вам нужно «try/catch» и способ восстановления после неудачного чтения. – Quantic