Página 1 de 1

Win32::ChangeNotify

NotaPublicado: 2012-08-30 08:30 @395
por princi
Hola nuevamente, por acá solicitando ayuda.

Estoy conociendo Win32::ChangeNotify y quisiera saber si hay alguna forma de saber exactamente qué archivo o directorio cambió.

No conozco mucho de Perl por eso pido ayuda. Busqué ejemplos pero no encuentro alguno parecido a lo que yo quiero hacer.

¡Disculpen las molestias!

Este ejemplo encontré, hice un print $notify pero me muestra Win32::ChangeNotify=SCALAR(0x468b74), y la verdad no entiendo cómo mostrar qué es lo que se modificó...

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. #!c:/perl/bin/perl.exe
  2.  
  3. use strict;
  4. use warnings;
  5. use diagnostics;
  6. use Win32::ChangeNotify;
  7. use Win32::Event;
  8. use File::ChangeNotify;
  9.  
  10.  
  11. my $Path="C:\\xxx\\yyy\\zzz\\";
  12. my $WatchSubTree=1;
  13. #my $Events='FILE_NAME'; con este funciona si creo/elimino/o modifico el NOMBRE de un archivo
  14. my $Events ='LAST_WRITE';
  15. my $changes=0;
  16.  
  17. my $notify = Win32::ChangeNotify->new($Path,$WatchSubTree,$Events);
  18.  
  19. while (1)
  20. {
  21.         print " $changes cambios hasta ahora para $Path.\n";
  22.         $notify->wait;
  23.         ++$changes;
  24.         $notify->reset;
  25.        
  26. }
Coloreado en 0.002 segundos, usando GeSHi 1.0.8.4

Re: Win32::ChangeNotify

NotaPublicado: 2012-08-30 10:09 @465
por explorer
Lo dice la propia documentación del módulo Win32::ChangeNotify:
Desafortunadamente, la API de Win32 que implementa esta característica no ofrece ninguna indicación de qué disparó la notificación (que yo sepa). Si está monitorizando un directorio para ver los cambios en los archivos, y necesita saber qué archivo cambió, deberá encontrar alguna otra forma de determinarlo. Dependiendo de exactamente qué esté intentando hacer, podría ser capaz de comprobar los tiempos de modificación de los archivos para encontrar los archivos más recientemente modificados. O puede necesitar almacenar los contenidos del directorio en algún otro sitio y comparar los contenidos actuales con los almacenados cuando reciba la notificación del cambio.

Así que te espera un trabajo más manual: si esperas por un cambio en un directorio, deberás acceder y ver los tiempos de cada archivo, para saber qué archivo cambió.

Cosa distinta es File::ChangeNotify. Con esta distribución sí que puedes saberlo.

Re: Win32::ChangeNotify

NotaPublicado: 2012-08-30 10:30 @479
por princi
¡Ah!, pido disculpas, yo había llegado a
http://www.xav.com/perl/site/lib/Win32/ChangeNotify.html#win32::ipc
y no me aclaraba esa parte...

Sí, después de citar llegué a File::ChangeNotify e intenté:

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $contador=0; # solo lo uso para ver la cantidad de cambios, no es muy importante
  2. my $watcher =    File::ChangeNotify->instantiate_watcher
  3.             ( directories => ["C:\\xxx\\yy\\zz\\$yr_actual\\","C:\\xxx\\yy\\zz\\$yr_anterior\\"],
  4.               #filter      => qr/\.(?:pm|conf|yml)$/,
  5.             );
  6.  
  7.     # blocking
  8.     while ( my @events = $watcher->wait_for_events() ) # Este método hace que el espectador se bloquee
  9.                                                        # hasta que ve eventos interesantes, y luego
  10.                                                        # devolverlos en forma de lista.
  11.         {
  12.         print ". $contador // ¿? . \n";
  13.  
  14.         $contador++;
  15.         }
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4

pero sigo sin saber cómo mostrar qué cambió. Pido disculpas. Me cuesta bastante Perl, hago intentos, busco información pero al ser nueva, me cuesta saber cómo buscar, sé que ocupo tiempo importante de ustedes, pero necesito ayuda :(...

¡Saludos!

Re: Win32::ChangeNotify

NotaPublicado: 2012-08-30 14:30 @646
por explorer
Bueno, leyendo la documentación del módulo, creo que sería así (no lo he probado).

Sintáxis: [ Descargar ] [ Ocultar ]
Using perl Syntax Highlighting
  1. my $watcher = File::ChangeNotify->instantiate_watcher(
  2.     directories    => [                                      # directorios a analizar
  3.                           "C:/xxx/yy/zz/$yr_actual/",
  4.                           "C:/xxx/yy/zz/$yr_anterior/",
  5.                       ],
  6.     sleep_interval => 2,                                     # cada dos segundos
  7. );
  8.  
  9. # esperamos eventos
  10. while ( my @events = $watcher->wait_for_events() ) {          # nos devuelve una lista de eventos
  11.     for my $event (@events) {                                 # por cada evento,
  12.         print $event->path(), ' - ', $event->type(), "\n";    # sacamos la ruta y el tipo de evento
  13.     }
  14. }
  15.  
Coloreado en 0.001 segundos, usando GeSHi 1.0.8.4
Esto está sacado de File::ChangeNotify::Event.

P.D.: observa que se puede usar '/' para separar las rutas, con lo que es más cómodo escribirlas así.

Re: Win32::ChangeNotify

NotaPublicado: 2012-09-03 08:36 @400
por princi
Muchas gracias por tu tiempo, explorer.
¡Funcionó!
Sigo aprendiendo Perl