Mi aplicación escribe un archivo de registro (actualmente usa log4net). Me gustaría configurar un temporizador y un trabajador de segundo plano para leer el archivo de registro e imprimir su contenido con cierto control en mi formulario, mientras se está escribiendo.BackgroundWorker & Timer, leyendo solo nuevas líneas de un archivo de registro?
No puedo usar la clase FileSystemWatcher porque parece estar rota: a veces el evento "cambia" los incendios, a veces no. Y tiene una "tasa de puesta en común" extremadamente baja.
Así que creé un Timer y un FileSystemWatcher. En el evento "marcar" del temporizador, el trabajador de segundo plano hace su trabajo.
La pregunta es: cómo leer solo las líneas que se agregan desde la última comprobación del trabajador?
public LogForm()
{
InitializeComponent();
logWatcherTimer.Start();
}
private void logWatcherTimer_Tick(object sender, EventArgs e)
{
FileInfo log = new FileInfo(@"C:\log.txt");
if(!logWorker.IsBusy) logWorker.RunWorkerAsync(log);
}
private void logWorker_DoWork(object sender, DoWorkEventArgs e)
{
// Read only new lines since last check.
FileInfo log = (FileInfo) e.Argument;
// Here is the main question!
}
EDIT: Solución Código (tal vez hay una forma más elegante?):
private void logWatherWorker_DoWork(object sender, DoWorkEventArgs e)
{
// retval
string newLines = string.Empty;
FileInfo log = (FileInfo) e.Argument;
// Just skip if log file hasn't changed
if (lastLogLength == log.Length) return;
using (StreamReader stream = new StreamReader(log.FullName))
{
// Set the position to the last log size and read
// all the content added
stream.BaseStream.Position = lastLogLength;
newLines = stream.ReadToEnd();
}
// Keep track of the previuos log length
lastLogLength = log.Length;
// Assign the result back to the worker, to be
// consumed by the form
e.Result = newLines;
}
Elegí tu camino, muchas gracias. He editado la primera publicación para incluir la solución de código. – gremo
muchas gracias por publicar la solución –