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

Eventos Windows 2000

Estas en el tema de Eventos Windows 2000 en el foro de Programación General en Foros del Web. Hola amigos ! Estoy haciendo una pagina ASP, esta muestra los ficheros de un determinado directorio del servidor. Los clientes se conectan y visualizan estos ...
  #1 (permalink)  
Antiguo 10/12/2002, 05:38
 
Fecha de Ingreso: diciembre-2002
Mensajes: 4
Antigüedad: 21 años, 4 meses
Puntos: 0
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,
  #2 (permalink)  
Antiguo 13/12/2002, 05:07
 
Fecha de Ingreso: abril-2002
Mensajes: 438
Antigüedad: 22 años
Puntos: 2
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.
  #3 (permalink)  
Antiguo 16/12/2002, 03:32
 
Fecha de Ingreso: diciembre-2002
Mensajes: 4
Antigüedad: 21 años, 4 meses
Puntos: 0
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.
  #4 (permalink)  
Antiguo 16/12/2002, 03:52
 
Fecha de Ingreso: abril-2002
Mensajes: 438
Antigüedad: 22 años
Puntos: 2
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.
  #5 (permalink)  
Antiguo 16/12/2002, 04:51
 
Fecha de Ingreso: diciembre-2002
Mensajes: 4
Antigüedad: 21 años, 4 meses
Puntos: 0
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.
  #6 (permalink)  
Antiguo 16/12/2002, 14:10
 
Fecha de Ingreso: abril-2002
Mensajes: 438
Antigüedad: 22 años
Puntos: 2
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.
  #7 (permalink)  
Antiguo 17/12/2002, 12:41
Avatar de Jorge_Mota  
Fecha de Ingreso: diciembre-2002
Ubicación: Chapinlandia :-D
Mensajes: 725
Antigüedad: 21 años, 5 meses
Puntos: 11
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
__________________
Jorge Mota
Blog
Gubiz estafa
  #8 (permalink)  
Antiguo 17/12/2002, 12:44
Avatar de Jorge_Mota  
Fecha de Ingreso: diciembre-2002
Ubicación: Chapinlandia :-D
Mensajes: 725
Antigüedad: 21 años, 5 meses
Puntos: 11
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.
__________________
Jorge Mota
Blog
Gubiz estafa
  #9 (permalink)  
Antiguo 18/12/2002, 02:39
 
Fecha de Ingreso: abril-2002
Mensajes: 438
Antigüedad: 22 años
Puntos: 2
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.
  #10 (permalink)  
Antiguo 18/12/2002, 02:44
 
Fecha de Ingreso: abril-2002
Mensajes: 438
Antigüedad: 22 años
Puntos: 2
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.
  #11 (permalink)  
Antiguo 18/12/2002, 03:22
 
Fecha de Ingreso: diciembre-2002
Mensajes: 4
Antigüedad: 21 años, 4 meses
Puntos: 0
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
  #12 (permalink)  
Antiguo 18/12/2002, 10:03
Avatar de Jorge_Mota  
Fecha de Ingreso: diciembre-2002
Ubicación: Chapinlandia :-D
Mensajes: 725
Antigüedad: 21 años, 5 meses
Puntos: 11


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.
__________________
Jorge Mota
Blog
Gubiz estafa
  #13 (permalink)  
Antiguo 18/12/2002, 10:08
Avatar de Jorge_Mota  
Fecha de Ingreso: diciembre-2002
Ubicación: Chapinlandia :-D
Mensajes: 725
Antigüedad: 21 años, 5 meses
Puntos: 11
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.

__________________
Jorge Mota
Blog
Gubiz estafa
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

SíEste tema le ha gustado a 1 personas




La zona horaria es GMT -6. Ahora son las 07:08.