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 :

[langage] listage répertoire en récursif


Sujet :

Langage Perl

  1. #1
    Jeh
    Jeh est déconnecté
    Membre expérimenté Avatar de Jeh
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    203
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 203
    Par défaut [langage] listage répertoire en récursif
    Salut !

    J'ai un petit souci pour lire tous les fichiers d'un répertoire et les fichiers des sous-répertoires de ce dernier. J'ai un bout de code qui fonctionne pour un répertoire que j'ai complété pour faire une recherche récursive sur les sous-répertoires, mais voilà, ça fonctionne pour le niveau 1 mais pas pour le niveau 2...

    Avec l'arborescence suivante :
    Perl -> Nortel -> Javascript
    |-> Athd -> Javascript

    Dans chaque répertoire, il ya des fichiers (librairies).
    J'arrive bien à lister les répertoires 'Nortel' et 'Athd' (sous 'Perl') mais pas les sous répertoires de ceux-ci à savoir les répertoires 'Javascript'.

    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
    #!/usr/bin/perl
     
    use strict;
    my $nb_arg = @ARGV;
    if (($nb_arg > 1) or ($nb_arg <1)) {
        print "\nNombre d'arguments incorrect.";
        exit(1);
    }
     
    my $dir = $ARGV[0];
     
    ListRep($dir);
     
    sub ListRep {
        my ($dir) = @_;
        if (! -e $dir ) {
          print "Répertoire inconnu ($dir).";
          return undef;
         }
     
         if (! -d $dir ) {
          print "$dir n'est pas un répertoire.";
          return undef;
         }
     
         if (! opendir( DIR, $dir) ) {
          print "Impossible d'ouvrir le répertoire $dir : $!.";
          return undef;
         }
     
         my @files = grep !/(?:^\.$)|(?:^\.\.$)/, readdir DIR;
         closedir DIR;
         print "\nFICHIERS CONTENUS:\n";
         foreach(@files) {
            print $_."\n";
         }
         foreach(@files) {        
            if (-d $_) {
                print "\n\nREPERTOIRE : ".$_."\n";
                ListRep($_);
            }
         }
     
    }
     
    1;
    Si quelqu'un à une idée...

  2. #2
    Membre Expert
    Avatar de 2Eurocents
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 177
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 177
    Par défaut
    Bonjour,

    Tiens, j'ai ça en stock :
    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
     
    #!/usr/bin/perl -w
    #
    use strict ;
     
    sub traite
    {
      my $dossier=shift;
     
      my $prot_dossier=quotemeta($dossier);
     
      if ( -d $dossier ) {
        foreach (glob ($prot_dossier."/*")) {
          traite ($_) ;
        }
        print "Repertoire ($dossier)\n";
      } else {
        print "Fichier ($dossier)\n";
      }
    }
     
    foreach (@ARGV) {
      traite ($_);
    }
    Petit parcours récursif des répertoires à grand coup de glob (à la base, c'était un script pour faire un DELTREE, à la DOS).

    Ce n'est pas parfait (notamment dans la supposition : si ce n'est pas un répertoire, c'est un fichier), et le parcours est postfixé (à toi de voir si c'est gênant), mais ça marche assez bien.

    Il y a juste à quoter correctement les paramètres passés au script s'ils contiennent des espaces, et ça ne gère pas le glob (* ou ?) au niveau de la spécification de chemin de départ. Mais tout ça est facile à prendre en compte.

    Bonne continuation.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 46
    Par défaut
    Dans ton code tu perds la racine d'accès au fichier (tu ne gardes que le filename).
    Remplaces
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
         foreach(@files) {        
            if (-d $_) { 
                print "\n\nREPERTOIRE : ".$_."\n"; 
                ListRep($_); 
            } 
         }
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
         foreach(@files) {        
            if (-d $dir."\\".$_) { 
                print "\n\nREPERTOIRE : ".$_."\n"; 
                ListRep($dir."\\".$_); 
            } 
         }
    ca devrait mieux marcher.
    A+

  4. #4
    Jeh
    Jeh est déconnecté
    Membre expérimenté Avatar de Jeh
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    203
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations forums :
    Inscription : Septembre 2003
    Messages : 203
    Par défaut
    Citation Envoyé par JefDeBourges
    Dans ton code tu perds la racine d'accès au fichier (tu ne gardes que le filename).
    Remplaces
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
         foreach(@files) {        
            if (-d $_) { 
                print "\n\nREPERTOIRE : ".$_."\n"; 
                ListRep($_); 
            } 
         }
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
         foreach(@files) {        
            if (-d $dir."\\".$_) { 
                print "\n\nREPERTOIRE : ".$_."\n"; 
                ListRep($dir."\\".$_); 
            } 
         }
    ca devrait mieux marcher.
    A+
    Merci bien !!!!
    Mais avec une petite variante car je bosse sous Unix...:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
         foreach(@files) {        
            if (-d $dir."/".$_) { 
                print "\n\nREPERTOIRE : ".$_."\n"; 
                ListRep($dir."/".$_); 
            } 
         }

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

Discussions similaires

  1. Une erreur 233 de ms sql server
    Par Hokage dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 05/10/2009, 18h40
  2. Erreur 233 sous sql server
    Par brajae85 dans le forum Oracle
    Réponses: 3
    Dernier message: 18/05/2009, 17h12
  3. Réponses: 2
    Dernier message: 05/10/2004, 23h43

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