• Publicidad

Win32::ChangeNotify

Aquí encontrarás todo lo que sea específicamente acerca de módulos de Perl. Ya sea que estás compartiendo tu módulo, un manual o simplemente tienes una duda acerca de alguno.

Win32::ChangeNotify

Notapor princi » 2012-08-30 08:30 @395

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.007 segundos, usando GeSHi 1.0.8.4
princi
Perlero Nuevo
Perlero Nuevo
 
Mensajes: 15
Registrado: 2012-01-31 08:00 @375

Publicidad

Re: Win32::ChangeNotify

Notapor explorer » 2012-08-30 10:09 @465

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.
JF^D Perl Programming Language
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 12772
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Win32::ChangeNotify

Notapor princi » 2012-08-30 10:30 @479

¡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.007 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!
princi
Perlero Nuevo
Perlero Nuevo
 
Mensajes: 15
Registrado: 2012-01-31 08:00 @375

Re: Win32::ChangeNotify

Notapor explorer » 2012-08-30 14:30 @646

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.007 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í.
JF^D Perl Programming Language
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 12772
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Re: Win32::ChangeNotify

Notapor princi » 2012-09-03 08:36 @400

Muchas gracias por tu tiempo, explorer.
¡Funcionó!
Sigo aprendiendo Perl
princi
Perlero Nuevo
Perlero Nuevo
 
Mensajes: 15
Registrado: 2012-01-31 08:00 @375


Volver a Módulos

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 0 invitados