Con el siguiente programa
Using perl Syntax Highlighting
#!/usr/bin/perl -w
use strict
;
use Net
::FTP;
my $ftp = Net
::FTP->new("servidor.ftp.com", Debug
=> 1
)
or die "ERROR: No puedo conectarme al servidor: $@";
$ftp->login('usuario','contraseña')
or die "ERROR: No puedo hacer login: ", $ftp->message;
$ftp->cwd("public_html/cgi-bin")
or die "ERROR: No puedo entrar en el directorio: ", $ftp->message;
my @ficheros = $ftp->dir();
print join "\n", @ficheros;
print "\n";Coloreado en 0.005 segundos, usando
GeSHi 1.0.8.4
obtengo el listado largo de los ficheros.
En mi servidor, me devuelve una línea por cada fichero, de este modo:
- Código: Seleccionar todo
drwxrwxr-x 2 yo users 4096 Nov 15 2006 My
-rwxr-xr-x 1 yo users 5544 Oct 4 00:20 ajax_combo.pl
-rwxr-xr-x 1 yo users 646 Nov 15 2006 clienteTable.pl
-rwxr-xr-x 1 yo users 260 Aug 28 2006 comando.pl
-rwxr-xr-x 1 yo users 1532 Feb 2 2007 fechas.pl
Como ves, están los campos separados por espacios.
Puedo ahora sacar las nombres, las fechas y los tamaños de los ficheros con un simple
split:
Using perl Syntax Highlighting
my %ficheros;
chdir ("directorio de trabajo");
foreach ( @ficheros ) {
my ( $nombre, $mes, $dia, $hora, $tamano ) = (split " ")[-1
,-4
,-3
,-2
,-5
];
# Comprobar si son iguales:
# hacer un stat($nombre) para obtener la información del fichero local
# si el $tamano o fecha es distinto, lo bajamos con un get().
#
}Coloreado en 0.001 segundos, usando
GeSHi 1.0.8.4
Además, nos hemos colocado (chdir()) en el directorio donde están los ficheros locales. Para comprobar si tenemos que bajarlo o no, hacemos un stat() del fichero local y de todos los valores que nos devuelve, comparamos el tamaño y las fechas con el que está en el remoto. Con que uno solo de los valores sea distinto, nos lo bajamos.
Aquí hay un problema muy claro: esto fallará si no están sincronizados los relojes del cliente y del servidor. Si solo hay un segundo de diferencia, provocará que se bajen todos los ficheros, siempre. Una forma de solventarlo es haciendo diferencia de fechas: si el fichero que está en el servidor tiene más de... un día, por ejemplo, de diferencia con el local, entonces lo bajamos.
La mayor parte de las veces, bastaba con mirar el tamaño del fichero, porque suele cambiar con cada cambio de los ficheros, salvo en ficheros que siempre tienen el mismo tamaño (ficheros binarios que almacenan información siempre del mismo tamaño).
En CPAN hay más formas de hacer esto mismo. Por ejemplo, el script
mirror.