FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
#21
|
||||
|
||||
Lo mas optimo se supone que sería usar el gestlastline que estais comentando, pero en lugar de con un ttimer, con el evento del api de windows (el que te comenté en mi mensaje anterior) que se lanza sólo cuando se modifica el fichero.
Un saludo!
__________________
"la única iglesia que ilumina es la que arde" Anonimo |
#22
|
|||
|
|||
Hola Julian, coincido contigo totalmente.
Solo me queda una duda, que es donde falla el procedimiento que he adaptado basado en la funcion getlastline, y es la forma en la que se está generando el archivo de log. Si al generar las líneas del archivo de log se hace un flush por cada línea generada, funciona OK, pero si el flush se hace cada ciertas líneas entonces no funciona bien. No se si este componente contemplaria este caso... Saludos. |
#23
|
||||
|
||||
Cita:
Pues yo entiendo que son dos cosas distintas: 1. Saber cuando determinado archivo *.log ha sido modificado. 2. leer la ultima(s) líneas Para 1 puedes usarse un timer o el api de windows, y creo que hemos quedadi que lo mas elegante y correcto es el api de win. Para 2 pues puedes echar mano de cualquier funcion de leer archivos que tenga el delphi, tal como indican algunos ejemplos que nos han puesto en este mismo hilo. Lo que puedes hacer es poner aquí el cóodigo que te da error a ver que tal, pues con eso del flush no entiendo muy bien que es lo que te falla. Un saludo!
__________________
"la única iglesia que ilumina es la que arde" Anonimo |
#24
|
|||
|
|||
Hola Julián,
Correcto, son dos cosas. En cuanto a la primera mi duda es saber si tanto el timer como la api de windows se dan por enterados de que un archivo determinado se ha modificado o no desde que se lanza una instrucción write o solo se enteran en el momento en que se hace una instrucción flush del bufer a volcar a disco. (Esto tengo pendiente de probar en cuanto pueda). En lo referente al segundo punto, pues no hay ninguna duda todo está claro. En el mensaje #13 puse el codigo que estoy utilizadno, que no es que me de un error, sino que simplemente no funciona bien cuando desde el momento en que se hace un write para escribir el log si no se vuelca inmediatamente la línea a disco (con un flush) el código no se entera de que se ha enviado mas datos al archivo de log. Aqui te pongo un enlace a la función flush a ver si se entiende mejor lo que quiero comentar :-) : http://www.delphibasics.co.uk/RTL.asp?Name=Flush Cita:
|
#25
|
||||
|
||||
Cita:
http://www.delphibasics.co.uk/RTL.asp?Name=Flush Lee la descripcion de la ayuda. Medita sobre lo que dice. Alcanza la iluminación.
__________________
El malabarista. |
#26
|
||||
|
||||
Cita:
En realidad no mejoré la función, es la misma del mensaje #6 , sólo la integré a un TTimer para darle funcionalidad. ¿ Probaste el código del mensaje #17 y no te resultó ? Funcionó correctamente en todas mis pruebas, obteniendo en mi equipo, promedios de aprox. 850 microsegundos para conseguir la última de 100000 líneas. Te adjunto el ejemplo debajo; la primera ejecución demorará un poco ya que creará un archivo con 100000 líneas de texto aleatorio en la carpeta donde lo ejecutes. En cuanto a capturar la escritura en tiempo real, Delphi posee el componente TShellChangeNotifier que informa sobre las modificaciones sucedidas en determinada carpeta y de forma análoga podes obtenerlas usando API mediante la funcion SHChangeNotifyRegister. Pero de ambos modos se notifica sobre un cambio del archivo como tál (creacion, borrado, etc) y no sobre una alteración en los datos internos del mismo. No quiero decir con esto que no es posible conseguir la información, sino que yo no pude encontrar el modo todavía. Julián ya te puso un enlace y la sugerencia de utilizar un hook. Tal vez tengas que encarar ese punto por ese lado. Saludos.
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... Última edición por ecfisa fecha: 10-04-2013 a las 20:18:35. |
#27
|
||||
|
||||
¡Eso que dice ecfisa es lo que yo decía: un hook!
Es que ya no me acordaba de esas cosas, pues hace como 8 años que no uso el puto Windows,
__________________
"la única iglesia que ilumina es la que arde" Anonimo |
#28
|
|||
|
|||
Buenas,
He probado el código que proponias, sin embargo al ejecutarlo sobre un archivo abierto de log se "queja" de que está abierto por otra aplicación y no puede continuar..... seguiré probando el resto de vuestras propuestas :-) Saludos. Cita:
|
#29
|
||||
|
||||
Cita:
Muy probablemente tengas ese problema con cualquiera de las sugerencias de este hilo, eso es a lo que me refería en el mensaje (#4). Saludos.
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... |
#30
|
|||
|
|||
Si, eso es, pero se soluciona añadiendo el flag fmShareDenyNone en el momento de abrir el archivo
Saludos. :-) Cita:
|
#31
|
|||
|
|||
Ecfisa,
Por otro lado he probado el codigo que pones en el mensaje #17, pero tampoco contempla todas las líneas añadidas desde la última modificación y se "traga" algunas... sigo pensando que es lo del flush, je,je Gracias :-) EDITO: Otra cosa mas.... he intentado descargarme el ejemplo del mensaje #26 y no puedo, no se si será por el control de contenido de mi trabajo, pero al abrir el zip se queja de error crc (lo he intentado varias veces. lo probaré desde casa).... Última edición por paquechu fecha: 26-03-2013 a las 12:52:29. |
#32
|
||||
|
||||
Cita:
Saludos.
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... |
#33
|
||||
|
||||
Cita:
Saludos.
__________________
Daniel Didriksen Guía de estilo - Uso de las etiquetas - La otra guía de estilo .... |
#34
|
|||
|
|||
Acabo de hacer pruebas con el "notificador" que tiene la api de windows y creo que tampoco soluciona el problema de los cambios sufridos por un archivo en tiempo real.
He encontrado un archivo donde figura el componente y un ejemplo de uso que he probado de la siguiente forma: En mi PC: he ejecutado el programa de demo que incluye el archivo que os dejo en el post y cuando hay una modificacion en un archivo del directorio que se elija, el cambio de tamaño de archivo se refleja bien, pero cuando hago lo mismo en el servidor donde se genera el log del isa server (que es un servidor virtual) ya no parece enterarse de los cambios. NO se, creo que voy a investigar mas en la linea de guardar la posicion de la ultima línea leida y la próxima vez que el codigo detecte modificación leer a partir de esa posición..... Saludos. :-) Última edición por paquechu fecha: 26-03-2013 a las 15:32:46. Razón: Se me ha olvidado el archivo.... |
#35
|
||||
|
||||
paquechu,
Cita:
El código anterior permite detectar cambios a nivel de Creación, Modificación y Eliminación de Archivos y Directorios dentro de un Directorio específico (Directorio objetivo de Monitoreo) y sus subdirectorios por medio de la función ReadDirectoryChangesW. Este código fue probado en tres Máquinas Virtuales con Windows XP Professional x32, Windows 7 Professional x32 y x64 y una Máquina Física con Windows 7 Professional x32 y en todos los casos funcionó correctamente. El código esta disponible en el siguiente link: http://terawiki.clubdelphi.com/Delph...oryMonitor.rar Nota: Una forma simple de probar el programa es monitorear el directorio C:\ Revisa estos links: Cita:
Nelson. Última edición por nlsgarcia fecha: 27-03-2013 a las 04:08:25. |
#36
|
||||
|
||||
paquechu,
Cita:
Cita:
Cita:
El código anterior permite monitorear un archivo específico (Función ReadDirectoryChangesW) y por medio de un archivo de control determinar las líneas que se han adicionado durante el monitoreo. El código es una especialización de lo sugerido en los Msg #6 y #35. Nota: El código anterior asume el monitoreo de archivos de texto en el cual las lineas finalizan con los caracteres de control CRLF. Solo se puede monitorear un archivo a la vez en esta versión la cual permite: 1- Iniciar el Hilo de Monitoreo a un Archivo Específico. 2- Finalizar el Hilo de Monitoreo a un Archivo Específico. 3- Salvar los cambios registrados en el Archivo Monitoreado a un archivo de texto. 4- Solo se monitorean las líneas adicionadas. 5- El archivo de control es creado cada vez que se selecciona un archivo específico para monitoreo. El código esta disponible en el siguiente link: http://terawiki.clubdelphi.com/Delph...ileMonitor.rar Espero sea útil Nelson. Última edición por nlsgarcia fecha: 29-03-2013 a las 22:59:14. |
#37
|
||||
|
||||
paquechu,
Nota: La función GetFileLastLine del código del Msg #36 se modifico para adaptarse a posibles operaciones de Delete en el archivo monitoreado por medio de la Actualización del Valor de Control (Tamaño del archivo monitoreado), como se muestra a continuación: Esta modificación solo ajusta el valor de control en el caso de que el archivo monitoreado disminuya su tamaño, no se registra el cambio en el control TListBox. El nuevo código modificado esta disponible en el link: http://terawiki.clubdelphi.com/Delph...i%F3n+2%29.rar Espero sea útil Nelson. Última edición por nlsgarcia fecha: 29-03-2013 a las 23:57:19. |
#38
|
|||
|
|||
Hola nlsgarcia,
He probado el código y funciona a la perfección.... lee las líneas correctamente, se añadan una a una o varias de golpe. Gran curro :-) Muchisimas gracias por vuestra gran ayuda :-) Un abrazo. |
|
|
|