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 :

Parcourir une arborescence et afficher le contenu des différents répertoires en Perl


Sujet :

Langage Perl

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 183
    Points : 32
    Points
    32
    Par défaut Parcourir une arborescence et afficher le contenu des différents répertoires en Perl
    Bonjour à tous,

    je dois réaliser un programme en perl qui dois me permettre d'extraire mon arborescence ainsi que le contenu du répertoire.

    Voici un extrait de mon code :
    Pièce jointe 193641

    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
    use strict; 
    use warnings; 
    use File::Basename; 
    use Cwd;
     
    sub GetFilesList
    {
     
    my $fichier = "C:/Documents and Settings/pbaranowp/Documents/2015_11_12_13/"; ## voir tout les fichiers contenu dans 2015_11_12_13 ## 
    my $repertoire = dirname($fichier); 
    my $nom_fichier = basename($fichier); 
    print "$repertoire \n $nom_fichier\n"; 
     
            my $Path = "C:/Users/baranowp/Documents";
            my $FileFound;
            my @FilesList=("C:/Users/baranowp/Documents");
     
            # Lecture de la liste des fichiers
            opendir (my $FhRep, $Path)
                    or die "Impossible d'ouvrir le repertoire $Path\n";
            my @Contenu = grep { !/^\.\.?$/ } readdir($FhRep);
            closedir ($FhRep);
     
            foreach my $FileFound (@Contenu) {
     
                    # Traitement des fichiers
                    if ( -f "$Path/$FileFound") {
                            push ( @FilesList, "$Path/$FileFound" );
                    }
                    # Traitement des repertoires
                    elsif ( -d "$Path/$FileFound") {
                            # Boucle pour lancer la recherche en mode recursif
                            push (@FilesList, GetFilesList("$Path/$FileFound") );
                    }
     
            }
            return @FilesList;
    }
     
    #
    # Boucle principale
    #
    my @Files = GetFilesList ("C:/Users/baranowp/Documents");
    foreach my $File  (@Files) {
     
    	print getcwd;
    	print "$File\n";
    	print "la liste des dossiers et des fichiers est : $File";
     
     
    }
    Merci pour votre, bonne journée

  2. #2
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Et quelle est la question?

    Si ton programme ne fonctionne pas, dis nous en quoi il ne fonctionne pas: est-ce qu'il compile ou non, est-ce qu'il plante, est-ce qu'il se termine bien mais ne fait pas ce que tu veux? Etc.

    S'il-te-plaît, aide nous à t'aider.

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 183
    Points : 32
    Points
    32
    Par défaut : Parcourir une arborescence et afficher le contenu des différents répertoires en Perl
    Comment faire pour qu'il m'afffiche l'arborescence C:/Documents and Settings/pbaranowp/Documents/2015_11_12_13 ainsi que le contenu de ce répertoire ?

    Lorsque je l'exécute voici ce qu'il fait Pièce jointe 193648 et lorsque je fais un ctrl+C Pièce jointe 193649

    Il ne fait pas ce que je souhaite.

  4. #4
    Rédacteur/Modérateur

    Avatar de Lolo78
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Mai 2012
    Messages
    3 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2012
    Messages : 3 612
    Points : 12 469
    Points
    12 469
    Billets dans le blog
    1
    Par défaut
    Apparemment, tes fichiers se trouvent dans le répertoire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    C:/Documents and Settings/pbaranowp/Documents/2015_11_12_13/
    Et tu sembles les chercher dans le répertoire pointé par la variable $Path qui contient le chemin suivant: "C:/Users/baranowp/Documents":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    my $Path = "C:/Users/baranowp/Documents";
    my $FileFound;
    my @FilesList=("C:/Users/baranowp/Documents");
     
    # Lecture de la liste des fichiers
    opendir (my $FhRep, $Path)
    # ...
    A priori, tu ne risques pas de les trouver à cet endroit. Pourquoi ne pas les cherche directement au bon endroit? Mais, bon ceci est assez secondaire, c'est du travail inutile et tu risques de récupérer des fichiers que tu ne souhaites pas (dans un autre sous-répertoire), mais ça devrait pouvoir marcher quand même à peu près si le reste était correct.

    Le principal problème semble être que, quand tu appelles récursivement la fonction GetFilesList, celle-ci recherche à nouveau dans le répertoire codé en dur au début de la fonction au lieu de rechercher dans le répertoire que tu lui passes en paramètre.

    Ta fonction doit ressembler, à vue de nez, à quelque chose comme ceci (pseudo-code non testé):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    sub get_files {
        my $path = shift;
        my @files;
        my @content = glob ("$path/*.*");
        for my $entry (@content) {
            if (-f $entry) {
                push @files, $entry;
            } else {
                push @files, get_files("$path/$entry");
            }
        }
        return @files;
    }
    Et tu appelles cette fonction avec en paramètre le chemin du répertoire racine que tu veux explorer, par exemple quelque chose de ce genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    my @list = get_files("C:/Documents and Settings/pbaranowp/Documents/2015_11_12_13/");

    Tu peux jeter un coup d’œil à ce tutoriel pour trouver un exemple de code réellement testé de parcours récursif d'un répertoire: L'exemple du parcours d'un répertoire.

    Mais comme je le dis moi-même dans ce tuto, "il existe un module standard, File::Find, nettement plus perfectionné, faisant à peu près la même chose et bien d'autres choses en plus". Si tu veux juste apprendre à le faire toi-même, alors utilise ce tuto pour te guider, mais si tu veux juste trouver récursivement trouver l'arborescence du répertoire pour faire d'autres choses, utilise plutôt le module File::Find.

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 183
    Points : 32
    Points
    32
    Par défaut
    Merci pour toutes ces informations. Je te tiendrais au courant si le programme a fonctionné.
    Je viens de tester le programme il compile mais ne m'affiche rien lorsque je l'exécute.
    Je pense qu'il faut que je créer une fonction qui me permettra de me déplacer dans le répertoire. Est-ce qu'utiliser une commande shell peut être utile du genre un dir ou un ls ?

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 183
    Points : 32
    Points
    32
    Par défaut
    Bonjour à tous,
    Voici le code qui je pense me permet de parcourir une arborescence et afficher le contenu des différents répertoires en perl :



    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
    use strict;
    use warnings;
     
     
    my $Path = "C:/Users/baranowp/Documents";
    my $Filefound;
    my @filelist = ("C:/Users/baranowp/Documents");
     
     
    opendir (my $Fhrep, $Path);
     
    sub get_files {
    	my $path = shift;
    	my @files;
    	my @content = glob ("$path/*.*");
    	for my $entry (@content) {
    		if (-f $entry) {
    			push @files, $entry;
    		} else {
    				push @files, get_files ("$path/$entry");
    				}
    		}
    	return @files;
    }
    system "dir $Path";
    print "$Path \n";
    Lorsque j'exécute ce programme voici ce qu'il me renvoie :
    Pièce jointe 193748

    Merci, bonne fin de journée.

  7. #7
    Membre habitué
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Juillet 2014
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2014
    Messages : 84
    Points : 197
    Points
    197
    Par défaut
    Pour parcourir un répertoire, ce ne sont pas les exemples qui manquent :
    http://www.desmoulins.fr/index.php?p...!perl!dir_list

    Il faut bien penser à appeler la fonction 'get_files' sinon elle ne sert à rien.

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2015
    Messages
    183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2015
    Messages : 183
    Points : 32
    Points
    32
    Par défaut
    Lorsque j'exécute le programme que vous m'avez donné, il m'affiche ceci:
    use strict;
    use warnings;

    sub GetFilesList
    {
    my $Path = $_[0];
    my $FileFound;
    my @FilesList=();

    # Lecture de la liste des fichiers
    opendir (my $FhRep, $Path)
    or die "Impossible d'ouvrir le repertoire $Path\n";
    my @Contenu = grep { !/^\.\.?$/ } readdir($FhRep);
    closedir ($FhRep);

    foreach my $FileFound (@Contenu) {
    # Traitement des fichiers
    if ( -f "$Path/$FileFound") {
    push ( @FilesList, "$Path/$FileFound" );
    }
    # Traitement des repertoires
    elsif ( -d "$Path/$FileFound") {
    # Boucle pour lancer la recherche en mode recursif
    push (@FilesList, GetFilesList("$Path/$FileFound") );
    }

    }
    return @FilesList;
    }

    #
    # Boucle principale
    #
    my @Files = GetFilesList ("C:/Users/baranowp");
    foreach my $File (@Files) {
    print "$File\n";
    system "dir";
    }

    Pièce jointe 194198

    alors que je n'ai pas de dossier de ce nom dans ce répertoire.

    Cordialement
    Merci d'avance

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 05/03/2012, 15h04
  2. Réponses: 6
    Dernier message: 25/10/2006, 21h00
  3. Réponses: 14
    Dernier message: 19/10/2006, 14h23
  4. Réponses: 2
    Dernier message: 04/05/2006, 19h53
  5. [VB6] parcourir une arborescence de repertoire
    Par pecheur dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 30/04/2003, 17h33

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