Foros del Web » Programación para mayores de 30 ;) » .NET »

Mostrar en tiempo real el contenido de un archivo de texto

Estas en el tema de Mostrar en tiempo real el contenido de un archivo de texto en el foro de .NET en Foros del Web. Hola, tengo un archivo "server.log" que no es más que un archivo de texto plano en el que un servidor CraftBukkit va escribiendo continuamente el ...
  #1 (permalink)  
Antiguo 28/08/2013, 13:15
 
Fecha de Ingreso: noviembre-2009
Mensajes: 67
Antigüedad: 14 años, 5 meses
Puntos: 2
Mostrar en tiempo real el contenido de un archivo de texto

Hola, tengo un archivo "server.log" que no es más que un archivo de texto plano en el que un servidor CraftBukkit va escribiendo continuamente el log del servidor.

La idea es mostrar en tiempo real el contenido de ese archivo en un textbox, y esta es mi primera prueba, usando un Timer a 100ms.

Código vb:
Ver original
  1. Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
  2.         Dim logFileStream As New FileStream(Application.StartupPath & "\" & ServerNameValue & "\" & "server.log", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)
  3.         Dim logFileReader As New StreamReader(logFileStream)
  4.  
  5.         While Not logFileReader.EndOfStream
  6.             Dim line As String = logFileReader.ReadLine()
  7.             For Each line2 In line
  8.                 If Not TextBox1.Text.Contains(line) Then
  9.                     TextBox1.Text = TextBox1.Text & line & vbNewLine
  10.                 End If
  11.             Next
  12.         End While
  13.  
  14.         ' Clean up
  15.        logFileReader.Close()
  16.         logFileStream.Close()
  17.  
  18.     End Sub

Funciona, pero el programa se ralentiza lo que no está escrito, hasta el punto de que sencillamente no me puedo permitir usar esto.

Desde luego la clave no es usar un timer que esté leyéndolo todo continuamente y escribiéndolo todo en el textbox una y otra vez.

¿Alguien sabe otra forma mejor de hacerlo?
  #2 (permalink)  
Antiguo 29/08/2013, 08:05
 
Fecha de Ingreso: noviembre-2002
Ubicación: DF
Mensajes: 1.056
Antigüedad: 21 años, 4 meses
Puntos: 37
Respuesta: Mostrar en tiempo real el contenido de un archivo de texto

Pues con el timer yo podría un timer a unos 5 segundos.
Otra alternativa, si creo que el log recibiría mas de 3000 o 4,000 registros por dia quizá llenar una TABLA que seria el log, y allí ya tendría la ventaja de la database, sin leer un archivo de texto.
En el caso del log, que sea uno diferente por dia
  #3 (permalink)  
Antiguo 29/08/2013, 12:57
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años
Puntos: 344
Respuesta: Mostrar en tiempo real el contenido de un archivo de texto

Te dejo un ejemplo de como se podría hacer:

Ejemplo

Está hecho con Visual Studio 2012, pero es para que veas el código. Se utiliza un BackgroundWorker aunque podría haberse hecho con hilos normales.

Esta es la página del BackgroundWorker: http://msdn.microsoft.com/en-us/libr...undworker.aspx. Existe desde el framework 2.0, así que no hay problema.

Este ejemplo lo que hace es leer continuamente el fichero, aunque poniendo el Thread.Sleep liberas mucha carga del procesador y casi no consume (a mi me consume un 0,2%). No he tenido en cuenta que en el fichero se eliminen cosas, siempre se supone que se añade. Si quieres soportar esto, tendrás que cambiar algunas cosas.

Un saludo.
  #4 (permalink)  
Antiguo 29/08/2013, 14:54
 
Fecha de Ingreso: noviembre-2009
Mensajes: 67
Antigüedad: 14 años, 5 meses
Puntos: 2
Respuesta: Mostrar en tiempo real el contenido de un archivo de texto

wwwmaster: Hola, gracias por responder. Me temo que poner el timer a 5 segundos no arreglaría gran cosa, serían interrupciones de la interfaz cada 5 segundos bastante molestas. En cuanto a lo de la tabla, ¿no tendría primero que convertir el server.log a una base de datos y luego leer la base de datos? sería bastante redundante. No tengo ninguna experiencia con bases de datos así que no termino de entender lo que sugieres.

alexg88: Muchas gracias por tu ejemplo, no entiendo ni pizca del código :P, da tirones al añadir texto pero eso es mucho mejor que tirones continuamente aunque ni esté añadiendo texto.

Pero presenta dos problemas, el primero es que al intentar leer un log bastante antiguo, que pesa 1,5MB, el programa se ha colgado por completo hasta el punto de que no podía hacer clic en ningún sitio y ni meter el cursor en la barra de tareas. Con el administrador de tareas se arregló.

El segundo problema es que añade el texto tal cual se ve en el bloc de notas, que es una masa de texto pegada que no diferencia las líneas. Eso con Notepad++ o el código que publiqué al principio no ocurre.

Aquí un ejemplo de server.log: https://www.dropbox.com/s/sdmmrxsu5v2akx4/server.log

Así es como se tendría que ver: https://www.dropbox.com/s/6yexkxovikcayg6/Captura.PNG

He intentado arreglarlo yo mismo, pero lo dicho, no sé en qué parte debería meter un vbnewline. Seguiré leyéndolo más detenidamente, a ver si lo consigo.
  #5 (permalink)  
Antiguo 10/09/2013, 23:30
 
Fecha de Ingreso: noviembre-2002
Ubicación: DF
Mensajes: 1.056
Antigüedad: 21 años, 4 meses
Puntos: 37
Respuesta: Mostrar en tiempo real el contenido de un archivo de texto

Debieras cortar tu log por un nuevo archivo cada "x" tiempo (ya sea por dia o por peso, evaluando el tamaño del mismo)
"Me temo que poner el timer a 5 segundos no arreglaría gran cosa, serían interrupciones de la interfaz cada 5 segundos bastante molestas. "
La lectura de archivos no afecta la escritura, por que el archivo no se abre con bloqueo.

"En cuanto a lo de la tabla, ¿no tendría primero que convertir el server.log a una base de datos y luego leer la base de datos? sería bastante redundante. No tengo ninguna experiencia con bases de datos así que no termino de entender lo que sugieres."

Mi sugerencia era q en lugar de grabar a un .txt era grabar directo a una tabla en base de datos, pero solo lo recomendaria si son deveras muchas lineas de registro (no se, supongo que mas de 10,000 por dia).
  #6 (permalink)  
Antiguo 21/09/2013, 04:19
 
Fecha de Ingreso: noviembre-2009
Mensajes: 67
Antigüedad: 14 años, 5 meses
Puntos: 2
Respuesta: Mostrar en tiempo real el contenido de un archivo de texto

Lo de escribir directamente en una base de datos queda descartado, ya que no es mi programa el que escribe el log, sino un servidor CraftBukkit: http://dl.bukkit.org/

Lo de los 5 segundos, no sé a qué te refieres. Lo tengo comprobado, poner mi timer a 5 segundos, lo que hace es leer todo el archivo otra vez, y escribir todo el texto otra vez, y eso produce lagazos en el programa.

Empiezo a pensar que esto asunto es algo muy avanzado.

Por otro lado, aún no conseguí aprovechar el ejemplo de alexg88. No logro que cada línea se muestre como una línea aparte. Conseguir arreglar eso, y además hacer lo de cortar el archivo cuando llegue a cierto peso (supongo que esto puedo descubrir cómo hacerlo en un rato) sería magnífico para dar por resuelto este tema, al menos durante un tiempo.
  #7 (permalink)  
Antiguo 21/09/2013, 07:41
 
Fecha de Ingreso: abril-2011
Mensajes: 1.342
Antigüedad: 13 años
Puntos: 344
Respuesta: Mostrar en tiempo real el contenido de un archivo de texto

Buenas,

He creado un ejemplo con RichTextBox y utilizando el método LoadFile (que tarda 1 segundo en cargar un archivo de 1,7 MB).

La idea es cargar el fichero inicial de golpe y luego ir leyendo las actualizaciones, porque el principal problema es actualizar el richtextbox (es lo que más tarda, no leer el fichero).

El ejemplo está en Ejemplo

Espero que te sirva.

Etiquetas: access, contenido, real, textbox, tiempo, vb
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:10.