Si no es muy urgente, sí, programaría una Tarea programada en Windows.
Pero, si fuera muy urgente que el fichero esté arriba lo antes posible, o si vas a poner la Tarea programada para que funcione a un ritmo rápido (un minuto o así), preferiría tener funcionando el programa todo el tiempo.
Lo que haría (en el caso de vigilar a un solo fichero. Si es vigilar varios ficheros o un directorio entero se hace de otra manera) es pedirle al propio sistema operativo que vigile a ese fichero, y que me avise cuando haya cambiado. Vamos, que nos lo haga casi todo
Esto se hace, en Windows, con el módulo
Win32::FileNotify, así (no probado):
Using perl Syntax Highlighting
#!Perl
use Win32::FileNotify;
use Net::FTP;
my $fichero = 'D:/Captura/Imagenes/quicklook_ultimo.jpg'; # ruta completa al fichero
my $notify;
while ("felices para siempre") { # bucle infinito
# <- aquí ponemos el código de subir el fichero al servidor
# ahora esperaremos a que cambie en el disco
$notify = Win32::FileNotify->new( $fichero ); # pedimos a Windows que lo vigile
$notify->wait; # y nos quedamos esperando
}
Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Como ves, se trata de hacer un bucle infinito, en el que nos quedamos esperando por cambios en el fichero y luego lo subimos inmediatamente, y volvemos a repetir.
Este programa la arrancamos un web y lo dejamos funcionando. Podríamos hacer que sacara una línea en la consola para informar de cuándo lo ha subido. Por ejemplo,
Using perl Syntax Highlighting
use POSIX
qw(strftime
);
# ...
print strftime
("%a %b %e %H:%M:%S %Y", localtime), " Fichero subido\n";Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Así, el usuario ve la actividad del programa.
Queda todo así (no probado):
Using perl Syntax Highlighting
#!Perl
#
# Vigilar un fichero, en sistemas Windows, y en cada cambio subirlo por FTP
# Joaquín Ferrero, 20101214.
#
use strict;
#use warnings;
#use diagnostics;
use Net::FTP;
use POSIX qw(strftime);
use Win32::FileNotify;
$|++; # no caché
### Configuración del programa ###
# Acceso al servidor FTP
my $ftp_servidor = 'ftp.compuglobalhipermega.net';
my $ftp_directorio = 'httpdocs/quicklook/';
my $ftp_usuario = 'yo_mismo';
my $ftp_clave = 'OhMyDear';
my $ruta = 'D:/Captura/Imagenes'; # ruta al fichero a vigilar
my $fichero = 'quicklook_ultimo.jpg'; # el vigilado
### Fin de la configuración ###
### Variables
my $ftp;
my $notify;
### Subrutinas
sub timestamp {
print strftime("%a %b %e %H:%M:%S %Y", localtime), " ", $_[0];
}
### Proceso
while ( 1 ) {
print timestamp("Conectando con el servidor $ftp_servidor");
unless ($ftp = Net::FTP->new($ftp_servidor)) {
print timestamp("ERROR: No se pudo conectar al servidor: $@\n");
sleep 30;
next;
}
print " Ok\n";
print timestamp("Identificación como $ftp_usuario");
unless ($ftp->login($ftp_usuario, $ftp_clave)) {
print timestamp('ERROR: Login incorrecto: ' . $ftp->message . "\n");
sleep 30;
next;
}
print " Ok\n";
print timestamp("Entrando en $ftp_directorio");
unless ($ftp->cwd($ftp_directorio)) {
print timestamp("ERROR: No puedo entrar en el directorio $ftp_directorio: " . $ftp->message . "\n");
sleep 30;
next;
}
print " Ok\n";
print timestamp('Subiendo fichero');
unless($ftp->put("$ruta/$fichero")) {
print timestamp("ERROR: No puedo subir el fichero $fichero: " . $ftp->message . "\n");
sleep 30;
next;
}
print " Ok\n";
$ftp->quit();
print timestamp("Esperando\n");
$notify = Win32::FileNotify->new( "$ruta/$fichero" ); # pedimos a Windows que lo vigile
$notify->wait; # y nos quedamos esperando
}
Coloreado en 0.004 segundos, usando
GeSHi 1.0.8.4