PDA

Ver la Versión Completa : Capturar escritura a fichero de otra aplicación


Lorena83
20-03-2008, 21:53:39
Hola a todos !!

Quiero realizar una aplicación que analice ficheros log de texto plano en tiempo real de aplicaciones de terceros. El caso es que no quiero hacer que mi programa compruebe periódicamente el fichero log para comprobar si ha sufrido modificaciones sino que de alguna manera "se enganche" a él y detecte inmediatamente cuando se ha escrito en él y el contenido añadido sin tener que releer el fichero de texto desde el principio.

Alguien puede echarme una mano con alguna sugerencia. :confused:

Saludos.
Lorena

cHackAll
24-03-2008, 16:15:59
Hola a todos !!

Quiero realizar una aplicación que analice ficheros log de texto plano en tiempo real de aplicaciones de terceros. El caso es que no quiero hacer que mi programa compruebe periódicamente el fichero log para comprobar si ha sufrido modificaciones sino que de alguna manera "se enganche" a él y detecte inmediatamente cuando se ha escrito en él y el contenido añadido sin tener que releer el fichero de texto desde el principio.

Alguien puede echarme una mano con alguna sugerencia. :confused:

Saludos.
Lorena

Se me ocurre que puedes comprobar la fecha de modificación/escritura del archivo (API GetFileTime, parámetro lpLastWriteTime), al cambiar el mismo recien verificas los cambios en el contenido del archivo.

Saludos

Lorena83
25-03-2008, 17:06:10
Ok, me parece una buena idea en cuanto me ahorro el examinar detalladamente el archivo para detectar posibles cambios (añadiduras), pero sigue siendo necesario tener un temporizador que compruebe periódicamente los cambios de la fecha de modificación. Y es que odio los temporizadores :D. Me suenan a programación cutre.

Existe alguna manera (callback creo que sería la denominación apropiada) de que el sistema notifique a mi aplicación el cambio del fichero que estoy monitorizando.

Un saludo

cHackAll
25-03-2008, 17:15:43
...Y es que odio los temporizadores :D. Me suenan a programación cutre...

Pues las herramientas que el S.O. pone a disponibilidad del desarrollador no debiesen ser "discriminadas" solo por un "sentimiento". A mi tampoco me agradaban los Timers, solo utilizaba hilos, pero ahora se que ambos tienen su lugar dado un determinado caso.

...Existe alguna manera (callback creo que sería la denominación apropiada) de que el sistema notifique a mi aplicación el cambio del fichero que estoy monitorizando.

Puedes utilizar la API FindFirstChangeNotification con el parámetro FILE_NOTIFY_CHANGE_LAST_WRITE (dentro de un hilo), sobre la carpeta que contiene el archivo en cuestión. Luego realizar la verificación de última escritura sobre el archivo y la comprobación de contenido.

La última forma es hacer un hook a la API de escritura en el proceso que accede al archivo. Y algo mas global sería hacer un hook a nivel de Driver; pero ambos casos son mucho mas complicados.

Saludos

Lorena83
26-03-2008, 16:56:23
Pues las herramientas que el S.O. pone a disponibilidad del desarrollador no debiesen ser "discriminadas" solo por un "sentimiento". A mi tampoco me agradaban los Timers, solo utilizaba hilos, pero ahora se que ambos tienen su lugar dado un determinado caso.Te pido disculpas si te he ofendido con mi manera de decir la cosas. En realidad al decir "programación cutre" quería decir que se trataba de una solución que no consideraba óptima ya que entiendo que de esa manera se produce un gasto inutil de recursos, si partimos de que el proceso lanzado por el temporizador se repite continuamente cuando seguramente no es preciso.

Puedes utilizar la API FindFirstChangeNotification con el parámetro FILE_NOTIFY_CHANGE_LAST_WRITE (dentro de un hilo), sobre la carpeta que contiene el archivo en cuestión. Luego realizar la verificación de última escritura sobre el archivo y la comprobación de contenido.Esta solución, en cambio, es mucho más cercana a lo que busco ya que es posible optimizar el consumo de recursos.

Muchas gracias por tu ayuda.

cHackAll
26-03-2008, 17:03:56
Te pido disculpas si te he ofendido con mi manera de decir la cosas...

Para nada Lorena83, el que talvez se expreso de una forma inadecuada fui yo y solo quise difundir un pensamiento (al igual que tu). ;)

Muchas gracias por tu ayuda.

Para servirte. :rolleyes:

Black_Ocean
28-03-2008, 05:26:46
Hola Lorena83.

Bueno... esto va para Delphi si es que estás programando con este lenguaje.

Mira... Hay un curioso componente que viene en Delphi 7 que se llama ShellChangeNotifier que pasa inadvertido por la mayoría de nosotros, ya que no viene documentado por Delphi y Borland nunca se ha referido en palabras o comentarios hacia este, Es como un componente para que uno lo empiece a descubrir. La razón, no lo se... Este componente se encuentra por defecto en la pestaña Samples del IDE de Delphi 7.

Así mismo nos cuenta y plantea nuestro amigo George Merriman de delphi.about.com http://delphi.about.com/od/vclusing/l/aa052403a.htm

Ahí encontrarás documentación y un ejemplo en código fuente.

Espero que sea lo que buscabas y planteabas ;)

Cordiales saludos.

Lorena83
29-03-2008, 13:32:46
Sí, es otra solución. Nunca había prestado atención a esos componentes. De hecho creo que se basa en las funciones API que hemos estado comentando.

Por otro lado, quiero seguir rizando el rizo. Imaginemos que usamos FindFirstChangeNotification/NextChangeNotification con FILE_NOTIFY_CHANGE_LAST_WRITE para detectar los archivos modificados. Pero ¿ como haríaris para detectar cuales de ellos realmente han sido alterados ? ¿ Conoceis alguna función que permita obtenerl sus nombre p.e. directamente ?

Porque una manera de hacerlo sería tener la fecha de modificación de todos los archivos del directorio que estemos monitorizando y cuando salta la función que hemos diseñado comprobar una por una las fechas de modificación para ver cual fue alterada. Esto funcionaría bien pero en un directorio con miles de archivos puede ser poco eficiente. No sé si me he explicado.

Alguna sugerencia ??

Un saludo.