Es muy fácil. Primero te colocas en el directorio donde quieres bajar los ficheros. Como veo que haces un get directamente, supongo entonces que estás ejecutando el programa en el mismo directorio que los ficheros. Si no es ese tu caso, tienes que hacer antes de bajarte nada un chdir para colocarte en el directorio que te interese.
Luego, en el bucle, haces lo siguiente:
Antes de bajarte el fichero $agb$EXT, compruebas si no existe ya en tu propio directorio. Si existe, entonces sales del bucle y sigues con el siguiente fichero:
- Código: Seleccionar todo
my $FTP = Net::FTP->new($SERVER) or die ("No se pudo conectar $!");
$FTP->login($USERNAME,$PWD) or die ("Login incorrecto: $!");
$FTP->cwd("/data/stgo/");
foreach $agb (@AUDIO) {
$fichero = "$agb$EXT";
next if -e $fichero;
$FTP->get( $fichero ) or unlink $fichero;
}
$FTP->quit();
Hemos hecho los siguientes cambios:
* El cwd lo hacemos al principio, porque sólo es necesario entrar en el directorio destino una vez.
* El quit lo hacemos al final, después del bucle, cuando terminemos con todos los ficheros.
* En el bucle, construímos el nombre del fichero y lo guardamos en $fichero.
* La línea mágica es la del next. Se lee: siguiente vuelta del bucle si existe el $fichero en el directorio.
* Finálmente, la línea del get tiene algo especial. La función get nos tiene que devolver el nombre del fichero que ha conseguido traer, o un valor undef (indefinido) si ha ocurrido un fallo. Y eso es lo que aprovechamos. Con la ayuda del 'or', en caso de que get falle, se ejecuta lo que sigue a continuación del 'or'. La línea se lee así: Coge el $fichero o bórralo de mi disco. Es decir, si ocurre el más mínimo fallo a la hora de traer el fichero, lo borramos, para asegurarnos de que no nos hemos traído sólo una parte de él.
Naturalmente, esto es muy drástico. Borrar el fichero entero en caso de algún fallo.
Si quisíeramos traernos sólo la parte que falta -que es lo que comentas en el primer mensaje-, entonces debemos poner la longitud de lo que ya tenemos descargado, para que get sólo baje lo que queda:
- Código: Seleccionar todo
foreach $agb (@AUDIO) {
$fichero = "$agb$EXT";
$FTP->get($fichero, -s $fichero);
}
Hemos quitado la línea next porque, en caso de que ya exista el $fichero en nuestro directorio, el ftp se encontrará con que tiene que bajarse 0 bytes, así que en realidad no se bajará nada y pasará rápidamente al siguiente fichero.