• Publicidad

Envío de fichero por ftp

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Envío de fichero por ftp

Notapor laliebre » 2005-05-04 18:54 @829

Hola perl users

Tengo confusión con algo, necesito descargar desde un servidor via ftp los siguientes archivos :
file1
file2
file3
file4

Mi curiosidad radica en que si utilizo el módulo Net::FTP ¿me permite continuar la descarga donde se quedó en caso de que se interrumpa?.
Ejemplo, si ya he descargado file1, file2 y se suspende la conexión, cuando se conecta de nuevo quiero que continue en file3.

¿Que puedo utilizar??

Saludos

LaLiebre
laliebre
Perlero nuevo
Perlero nuevo
 
Mensajes: 10
Registrado: 2004-05-03 16:01 @709

Publicidad

Notapor kidd » 2005-05-04 20:25 @892

Hola:

Específicamente no lo podrías hacer con el módulo de FTP en si, sin embargo si podrías lograrlo usando otras funciones de perl.

Por ejemplo podrías tener un txt con todos los archivos que quieres descargar, entonces vas eliminando del txt los archivos que ya descargaste de forma éxitosa. Entonces en el caso de que se interrumpa el programa, va a poder seguir donde estaba, pues al leer el txt se va a dar cuenta de los archivos que faltan por descargar.

De manera sencilla puedes hacer algo así, ya nada más debes customizarlo a tus necesidades.


SALUDOS
Uriel Lizama Perl programmer fundador de Perl en Español
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1166
Registrado: 2003-10-15 16:52 @744
Ubicación: México

Notapor laliebre » 2005-05-05 06:46 @324

Ok entiendo,

Pero y como hago la transferencia de archivos desde aquel servidor al mio sin utilizar el modulo ?

Gracias por su ayuda


LaLiebre
laliebre
Perlero nuevo
Perlero nuevo
 
Mensajes: 10
Registrado: 2004-05-03 16:01 @709

Notapor kidd » 2005-05-05 08:48 @408

Hola:

Yo no decía que lo dejaras de usar, solamente te daba una idea para lograr lo que quieres, incluyendo el uso del módulo Net::FTP.


SALUDOS
Uriel Lizama Perl programmer fundador de Perl en Español
Perl Programming Language
Avatar de Usuario
kidd
Creador de Perl en Español
Creador de Perl en Español
 
Mensajes: 1166
Registrado: 2003-10-15 16:52 @744
Ubicación: México

Notapor laliebre » 2005-05-09 13:51 @619

Saludos de nuevo

Tengo el script pero me falta la parte donde continuaría la conexión en caso de que sucediera alguna suspensión. Si alguien me echa una mano, estaré agradecido.

Saludos

LaLiebre

Código: Seleccionar todo
#!/usr/bin/perl -w
#Programa que crea un archivo y hace una copia hacia otro servidor;
#Creado por LaLiebre para ISilver;

use strict;
use Net::FTP;

my $USERNAME = "user";
my $PWD = "passw";
my $SERVER = "ip";
my $EXT = ".tar.gz";
my @AUDIO = qw/audio audio1 audio2 audio3 audio4 audio5 audio6 audio7 audio8/;


#Abro la conexion FTP;
my $FTP = Net::FTP->new($SERVER) or die ("No se pudo conectar $!");
$FTP->login($USERNAME,$PWD) or die ("Login incorrecto: $!");

foreach $agb (@AUDIO) {
$FTP->cwd("/data/stgo/");
$FTP->get("$agb$EXT");
$FTP->quit();
}
laliebre
Perlero nuevo
Perlero nuevo
 
Mensajes: 10
Registrado: 2004-05-03 16:01 @709

Notapor explorer » 2006-06-14 06:48 @325

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.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14480
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España


Volver a Intermedio

¿Quién está conectado?

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