IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Perl Discussion :

LECTURE des repertoires sur un ftp


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de fripette
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 242
    Par défaut LECTURE des repertoires sur un ftp
    Bonjour a tous,

    Je suis desolee de tres certainement reposer cette question mais ca fait deux jours que je bloque dessus et je n'ai trouve de reponse adequate nulle part.

    Et d'ailleurs si Djibril parce par mon post et qu'a l'avenir mon script marche j'aimerais le soumettre parce que je ne l'ai trouve ni dans http://www.developpez.net/forums/d65...ponibles-perl/
    non plus ici :
    http://perl.developpez.com/sources/


    Mon probleme est simple, j'aimerai lister tous les directory et subdirectory presents dans un site ftp.

    J'etais partie sur ceci:http://cpansearch.perl.org/src/JDLEE...4/samples/rget

    mais je me suis rendue compte qu'il y avait effectivement un listing de ceux ci MAIS avec une recuperation en local de l'ensemble de l'architecture et des fichiers provenant du ftp.

    Donc j'ai abandonne cette piste.

    J'ai ensuite trouve ce bout de script:
    http://www.go4expert.com/forums/showthread.php?t=2348

    Et donc voila j'ai cru trouver mon bonheur mais la recursivite ne se fait "pas bien".

    Voici l'adresse ftp que je parse: ftp://ftp.ncbi.nlm.nih.gov/genbank/genomes/A_thaliana/

    Voici mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
     
    # required modules
    use Net::FTP;
    use Net::FTP::File;
    use Data::Dumper;
    use File::Listing qw(parse_dir);
     
     
    print("Connecting to FTP ... ");
    # create a new instance of the FTP connection
    $ftp = Net::FTP->new( "ftp.ncbi.nlm.nih.gov", Debug => 0 )
      or die("Cannot connect $!");
     
    # login to the server
    $ftp->login( "anonymous", "anonymous" ) or die("Login failed $!");
    print(" Logged in ... \n");
    @y = getRecursiveDirListing("/genbank/genomes/A_thaliana/");
    print "the join \n";
    print join( "\n", @y );
     
    # close the FTP connection
    $ftp->quit();
     
    sub getRecursiveDirListing {
     
    	# create an array to hold directories, it should be a local variable
    	local @dirs = ();
     
    	# directory parameter passed to the sub-routine
    	my $dir = $_[0];
     
      # if the directory was passed onto the sub-routin, change the remote directory
    	$ftp->cwd($dir) if ($dir);
     
     
    	# get the file listing
    	@ls = $ftp->ls('-lR');
     
    	# the current working directory on the remote server
    	my $cur_dir = $ftp->pwd();
    	print "cur_dir: ",$cur_dir,"\n";
    	# parse and loop through the directory listing
    	foreach my $name (@ls) {
    		my $isdir = $ftp->isdir($name);
    		next if(!$isdir);
     
       		push( @dirs, "$cur_dir/$name" );    # push the directory into the array   	
       		# recursive call to get the entries in the entry, and get an array of return values	
       		@xx = getRecursiveDirListing("$cur_dir/$name");	
    	}
    	# merge the array returned from the recursive call with the current directory listing
     
    	return (@dirs, @xx);
    }
    et le resultat de celui ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Connecting to FTP ...  Logged in ... 
    cur_dir: /genbank/genomes/A_thaliana
    cur_dir: /genbank/genomes/A_thaliana/OLD
    cur_dir: /genbank/genomes/A_thaliana/OLD/CHR_I
    the join 
    /genbank/genomes/A_thaliana/OLD
    /genbank/genomes/A_thaliana/OLD/CHR_I
    Donc comme vous pouvez le voir la recursivite se fait bien du repertoire OLD vers CHR_I, et malheureusement le foreach est foireux lors du OLD (ou plutot je ne comprends pas pourquoi les autres repertoires dans le @ls ne sont pas parses) car il y a aussi les sous repertoires CHRII a V qui ne sont pas traites


    Merci beaucoup d'avance pour votre aide precieuse (!!!),

    Sinon j'ai essaye d'adapter un bout de code de Djibril sur le parsing de dossier mais je ne vous le mets par parce qu'il ne marche pas non plus

  2. #2
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    J'ai ajouté "use strict", modifié quelques déclaration de variables, mais surtout, corrigé le bug : il faut faire cwd("..") à chaque retour de récursion :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    use strict;
    use Net::FTP;
    use Net::FTP::File;
    use Data::Dumper;
    use File::Listing qw(parse_dir);
     
     
    print("Connecting to FTP ... ");
    # create a new instance of the FTP connection
    my $ftp = Net::FTP->new( "ftp.ncbi.nlm.nih.gov", Debug => 0 )
      or die("Cannot connect $!");
     
    # login to the server
    $ftp->login( "anonymous", "anonymous" ) or die("Login failed $!");
    print(" Logged in ... \n");
    my @y = getRecursiveDirListing("/genbank/genomes/A_thaliana/");
    print "the join \n";
    print join( "\n", @y );
     
    # close the FTP connection
    $ftp->quit();
     
    sub getRecursiveDirListing {
     
    	# create an array to hold directories, it should be a local variable
    	my @dirs = ();
     
    	# directory parameter passed to the sub-routine
    	my $dir = $_[0];
     
      # if the directory was passed onto the sub-routin, change the remote directory
    	$ftp->cwd($dir) if ($dir);
     
     
    	# get the file listing
    	my @ls = $ftp->ls('-lR');
     
    	# the current working directory on the remote server
    	my $cur_dir = $ftp->pwd();
    	print "cur_dir: ",$cur_dir,"\n";
    	# parse and loop through the directory listing
    	foreach my $name (@ls) {
    		my $isdir = $ftp->isdir($name);
    		next if(!$isdir);
     
       		push( @dirs, "$cur_dir/$name" );    # push the directory into the array   	
       		# recursive call to get the entries in the entry, and get an array of return values	
       		push( @dirs,  getRecursiveDirListing("$cur_dir/$name"));	
    	}
    	# merge the array returned from the recursive call with the current directory listing
     
            $ftp->cwd("..");
    	return (@dirs);
    }

  3. #3
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    Voici ton code très simplifié, plus compact et propre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    #!/usr/bin/perl
    use warnings;
    use strict;
    use Carp;
     
    # required modules
    use Net::FTP;
    use Net::FTP::File;
     
    print "Connecting to FTP ... \n";
     
    # create a new instance of the FTP connection
    my $ftp = Net::FTP->new( "ftp.ncbi.nlm.nih.gov", Debug => 0 ) or die("Cannot connect $!");
     
    # login to the server
    $ftp->login( "anonymous", "anonymous" ) or die("Login failed $!");
    print " Logged in ... \n";
    getRecursiveDirListing( $ftp, "/genbank/genomes/A_thaliana" );
     
    # close the FTP connection
    $ftp->quit();
     
    sub getRecursiveDirListing {
      my ( $ftp, $repertoire_distant ) = @_;
     
      print "$repertoire_distant\n";
      $ftp->cwd($repertoire_distant) or die "CWD impossible : $repertoire_distant\n", $ftp->message;
     
      # parse and loop through the directory listing
      foreach my $filerep ( $ftp->ls() ) {
        my $nom_complet = "$repertoire_distant/$filerep";
        if ( $ftp->isdir($filerep) ) {
          getRecursiveDirListing( $ftp, $nom_complet );
        }
        else {
          print "$nom_complet\n";
        }
      }
     
      $ftp->cwd('..') or die "Retour arrier impossible\n", $ftp->message;
     
      return;
    }

  4. #4
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    argffff: Philou m'a grillé . Bon en même temps, il a repris ton code, moi je l'ai modifié

  5. #5
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Ton code est effectivement mieux écrit, Djibril. Je regrette simplement la suppression de l'usage d'un tableau des répertoires, remplacé par un print. En effet, l'usage d'un tableau est plus souple pour qui veut paramétrer la sortie de ces données (fichier, STDOUT, Data::Dumper, autre traitement).

  6. #6
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 822
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 822
    Par défaut
    Oui c'est vrai. En fait, j'ai mis des print pour qu'il puisse voir ce que ça donne dans un affichage progressif. Mais on aurait effectivement pu tout stocker dans un tableau que le code ci-dessous. A noter que je stocke tout (répertoires et fichiers) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    #!/usr/bin/perl
    use warnings;
    use strict;
    use Carp;
     
    # required modules
    use Net::FTP;
    use Net::FTP::File;
     
    print "Connecting to FTP ... \n";
     
    # create a new instance of the FTP connection
    my $ftp = Net::FTP->new( "ftp.ncbi.nlm.nih.gov", Debug => 0 ) or die("Cannot connect $!");
     
    # login to the server
    $ftp->login( "anonymous", "anonymous" ) or die("Login failed $!");
    print "Logged in ... \n";
     
    my @data= ();
    getRecursiveDirListing( $ftp, "/genbank/genomes/A_thaliana", \@data );
    foreach ( @data ) {
      print "$_\n";
    }
     
    # close the FTP connection
    $ftp->quit();
     
    sub getRecursiveDirListing {
      my ( $ftp, $repertoire_distant, $ref_data ) = @_;
     
      push ( @{$ref_data}, $repertoire_distant);
      $ftp->cwd($repertoire_distant) or die "CWD impossible : $repertoire_distant\n", $ftp->message;
     
      # parse and loop through the directory listing
      foreach my $filerep ( $ftp->ls() ) {
        my $nom_complet = "$repertoire_distant/$filerep";
        if ( $ftp->isdir($filerep) ) {
          getRecursiveDirListing( $ftp, $nom_complet, $ref_data );
        }
        else {
          push ( @{$ref_data}, $nom_complet);
        }
      }
     
      $ftp->cwd('..') or die "Retour arrier impossible\n", $ftp->message;
     
      return;
    }
    Je pense que le code est assez simple pour l'adapter à tout besoin.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Lecture des fichiers sur un serveur unix
    Par ben.83 dans le forum Développement de jobs
    Réponses: 1
    Dernier message: 15/10/2009, 15h03
  2. Ecriture et lecture des ressources sur une .exe
    Par LeRoi dans le forum Delphi
    Réponses: 8
    Dernier message: 06/10/2006, 22h46
  3. arborescence des repertoires sur XP
    Par Nemesys dans le forum Windows XP
    Réponses: 11
    Dernier message: 18/05/2006, 23h17
  4. [] [Réseau] Liste des répertoires d'un FTP
    Par Maitre Kanter dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 12/03/2003, 16h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo