![]() |
Eventos Windows 2000 Hola amigos ! Estoy haciendo una pagina ASP, esta muestra los ficheros de un determinado directorio del servidor. Los clientes se conectan y visualizan estos archivos. El sistema es un Windows 2000. Cada fichero de este directorio tiene asociado un registro en una base de datos, que contiene informacion asociada al fichero. Los ficheros de este directorio son actualizados ,modificados , eliminados constantemente por los usuarios, y la base de datos se queda rapidamente obsoleta. Por lo que me veo obligado a lanzar procesos nocturnos que actualicen esta informacion. Por ejemplo si un usuario elimina un fichero, se debe eliminar el registro asociado en la base de datos. Mi problema es que este sistema no es bueno, pq hasta que no se lanza los procesos, la info no se actualiza. Y estar periodicamente lanzando estos procesos cargan mucho el sistema. Lo suyo sería poder captar algun tipo de evento cuando se modifique algun fichero del directorio en concreto y asi poder asociarle el proceso que lo actualice. pero no se como hacerlo , no se si esto es posible con windows 2000. Gracias, :-D |
Hola, No sé si se puede hacer con windows2000, pero sí desde luego programando, simplemente almacena la fecha de última modificación del fichero en una BBDD, junto con los campos que tú creas oportuno y lanzas un proceso de rastreo (cada cierto tiempo, esto sí que lo puedes hacer en windows programando la tarea para que llame a tu .exe, o bien usas un timer y dejas la aplicación funcionando). En este proceso de rastreo "tragas" de nuevo la fecha de modificación (si el fichero existe) y la comparas con la existente, en el caso de ser diferntes haces lo que tengas que hacer y actualizas la BBDD, en el caso de ser iguales no haces nada. Si el fichero simplemente le pones un flag en la BBDD para indicarlo y haces lo que haya que hacer., Bueno, yo trataría de funcionar por este camino, aunque evidentemente la cosa habría que madurarla muchísmo más. Simplemente una idea. Saludos. |
Es exactamente la solución que tengo realizada, este método carga mucho el sistema, pues son muchos usuarios los que manejan esta aplicacion y debería realizar barridos constantemente. Como ellos acceden a la informacion de la base de datos antes de abrir cualquier fichero, este método produce incoherencias info-fichero. Ya que si el archivo ha sido modificado por algún usuario y no se ha producido una actualización puede ser que vea la info antes de actualizarse (Espero no liarte) De aqui que necesito desarrollarlo con algun evento y desasociar la actualizacion de un timer (necesitaria un periodo de actualizacion muy bajo --> Carga mucho el sistema (tambien tengo que decirte que es un servido muy antiguo )). Gracias por tu colaboración. |
Hola, Ya te aviso que lo que te voy a decir puede que no te sirva para nada, para absolutamente nada (no es sólo VB). Lo primero: ¿por qué se producen incoherencias? Trata de mantener los datos actualizados en todo momento, es decir, actualización de archivos implica actualización de BBDD. Respecto al evento al que te refieres, te comento que a uno de mis clientes le desarrollé una aplicacíón de monitorización en la que se controlaba la entrada y el procesamiento automático de archivos de tiendas al servidor central. ¿Cómo lo organizé? Lo desarrollé en VB, pero todo lo que es rastreo de ficheros lo desligué del código de visual basic y lo desarrollé en un servlet, así que desde VB y a través de un webbrowser hacía una llamada a ese servlet, el servlet me devolvía la información (tienda,fichero,fecha), lo cogía en VB y ya lo procesaba. Nada de sobrecargas ni malos rollos en el servidor, porque tampoco era un proceso brutal, era simplemente rastrear unos 250 directorios, y si lo programas eficientemente y en un solo segundo aproximadamente tienes la respuesta del servlet. Problema: necesitas programar en JAVA y tener instalado un servidor de aplicaciones, en mi caso era el JRun. Luego ya es cuestión de especificar cada cuanto tiempo llamas desde VB al servlet (en mi caso era 15 minutos) y en el evento navigateComplete del webbrowser empezar la programación de todo el proceso. Supongo que esto no te servirá para nada, pero desde luego y si lo haces desde VB a pelo, no se te ocurra usar la función Dir, lo puedes programar mucho más eficientemente y sobrecargar menos el proceso de rastreo si usas apis (en plan findfirstfile, findnextfile y todas las que hay para coger información del archivo en cuestión). No sé, se me hace difícil darte ayuda porque simplemente me estoy imaginando lo que quieres, es decir, no sé concretamente cual es el problema que se te da, ni el porqué, ni que hace tu aplicación, ni nada de nada. Pero bueno, no dudes en seguir posteando que daremos uno u otro con la solución adecuada a tu problema, eso de fijo. Saludos. |
El problema de todo es la actualización de archivos. Cualquier archivo puede ser abierto desde cualquier aplicación , editado a pelo. O simplemente cualquier usuario puede crear un archivo y copiarlo dentro de la estructura con el explorador de windows, editarlo = actualizarlo es muy dificil (sin eventos, si el periodo de actualizacion es muy alto se podria producir la siguiente incoherencia --> - Modifico el archivo x.doc con el word y guardo a saco. Este archivo ya tiene un registro en la BBDD pq ya estaba creado. - Informo a mi departamento que he colgado x.doc de la aplicacion con tal fecha de modificacion - Hasta que no se produzca la actualizacion el personal no tendrá la fecha de ultima modificacion correcta para x.doc ---> Tengo que tener periodos bajos de actualizacion y no aun asi ¿ No crees que no seria una manera poco elegante para resolver este problema ? (que asi la hize) El problema de este caso es que no he sido capaz de asociar un proceso de actualizacion al copiar y pegar de explorer de windows. (Te hablo del explorer, como si el usuario hace un copy desde la linea de comando, etc) Me parece que no tiene solución. Gracias por interesarte por el tema, supongo que esto es windows (un mundo de obstaculos).... cada dia me gusta mas linux... Saludos. |
Ahora entiendo, quieres atrapar desde VB cualquier cambio en el sistema de archivos de windows ¿no? Pero así, directamente, sin comparar con información almacenada, ni rastreando ni nada de eso. Algo así como un cambioSistemaArchivos_click (je je je) Si es eso lo que quieres hacer tengo que decirte que no tengo ni puta idea de como lo podrías hacer lo siento. Incluso te diría que no sé si se puede hacer realidad lo que te propones. |
tendrias que tener algo asi como un agente, en escucha, esperando a que suceda un cambio, ver que cambio hubo y en base a eso, ejecutar X accion. mira este codigo: Private Const FILE_NOTIFY_CHANGE_ATTRIBUTES = &H4 Private Const FILE_NOTIFY_CHANGE_DIR_NAME = &H2 Private Const FILE_NOTIFY_CHANGE_FILE_NAME = &H1 Private Const FILE_NOTIFY_CHANGE_SIZE = &H8 Private Const FILE_NOTIFY_CHANGE_LAST_WRITE = &H10 Private Const FILE_NOTIFY_CHANGE_SECURITY = &H100 Private Const FILE_NOTIFY_CHANGE_ALL = &H4 Or &H2 Or &H1 Or &H8 Or &H10 Or &H100 Private Declare Function FindFirstChangeNotification Lib "kernel32" Alias "FindFirstChangeNotificationA" (ByVal lpPathName As String, ByVal bWatchSubtree As Long, ByVal dwNotifyFilter As Long) As Long Private Declare Function FindCloseChangeNotification Lib "kernel32" (ByVal hChangeHandle As Long) As Long Private Declare Function FindNextChangeNotification Lib "kernel32" (ByVal hChangeHandle As Long) As Long Private Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long Private Declare Function ResetEvent Lib "kernel32" (ByVal hEvent As Long) As Long Private Sub Form_Load() Dim Ret As Long Ret = FindFirstChangeNotification("C:\", &HFFFFFFFF, FILE_NOTIFY_CHANGE_ALL) 'Wait until the event is triggered WaitForSingleObject Ret, &HFFFFFFFF MsgBox "Event Triggered for the first time" 'Reactivate our hook FindNextChangeNotification Ret 'Wait until the event is triggered WaitForSingleObject Ret, &HFFFFFFFF MsgBox "Event Triggered for the second time" 'Remove our hook FindCloseChangeNotification Ret End Sub |
upss le di a enviar antes de tiempo para que veas bien como funciona crea una Carpeta en tu c, llamada Pruebas sip luego en el codigo anterior reemplaza la linea Ret = FindFirstChangeNotification("C:\", &HFFFFFFFF, FILE_NOTIFY_CHANGE_ALL) por Ret = FindFirstChangeNotification("C:\Pruebas", &HFFFFFFFF, FILE_NOTIFY_CHANGE_ALL) ejecuta el programa y crea una carpeta dentro de c:\pruebas regresa al programa para ver si te dispara algo. luego, regresa a la carpeta y borra la que creaste igual intenta con pegar y borrar archivos en esa carpeta. aunque este codigo solo escucha para 3 cambios, tendrias que meterlo en un ciclo o algo por el estilo. |
Muy pero que muy pero que muy bueno Jorge. Gracias por dar luz a una discusión que parecía cerrada. Me gusta el código que has posteado, aunque no lo he probado a simple vista parece interesante, y la verdad, no conocía esas APIS. Así que eso que dije de "no creo que se pueda hacer realidad" (me muerdo la lengua). Saludos. |
Hola Jorge, Sólo un problemilla, ¿qué ocurre cuando lo que quieres es monitorizar o poner bajo inspección carpetas como C:\prueba1, c:\app\prueba2, c:\windows\prueba3, es decir, cada una de su padre y de su madre. Supongo que entonces la cosa se complica ya que vas a tener que tener capturadores del FindFirstChangeNotification para cada una de las carpetas ¿no? Saludos. |
Hola amigos, gracias por la ayuda que me estais facilitando. Me parece muy buena la solución que has aportado Jorge y agradecertelo pues me has salvado la vida pues no encontraba solución a la aplicación ya desarrollada, ahora puedo poner la guinda final. También agradecer a sdnsdlm todo el interés mostrado. Si os puedo ayudar en algo.... ;-) Saludos |
;-) cool. simplemente eso se puede decir de las apis. y si, esta api revisa cambios dentro de las carpetas por eso te dije que cambiaras el C:\ por C:\pruebas ya que si no, no logras captar cuando se captura el cambio. |
solo para terminar de explicar esta api lo que hace esta api, es crear una especie de disparador con base a un filtro, por ejemplo FILE_NOTIFY_CHANGE_ATTRIBUTES ese disparador se ejecutara cuando le cambien el atributo a una carpeta o archivo dentro del entorno o path que le indicaste. en el ejemplo se dispara con cualquier cambio FILE_NOTIFY_CHANGE_ALL ya que este captura todos, cambios en seguridad, escritura, etc. el problema de ponerlo en C:\ es que windows constantemente esta escribiendo o consultando archivos temporales, revisando el pagefile.sys lo cual provoca que se disparen tus eventos. y me alegra que te halla servido. ;-) |
| La zona horaria es GMT -6. Ahora son las 20:54. |
Desarrollado por vBulletin® Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.