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

Modules Perl Discussion :

module Archive :: Extract


Sujet :

Modules Perl

  1. #1
    Futur Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 16
    Points : 6
    Points
    6
    Par défaut module Archive :: Extract
    Bonjour,
    je veux extraire des archives tar.gz, j'en ai une grande quantité et j'ai fait un script qui me trouble par son comportement.
    Tous les fichiers sont dans un repertoire C:/source
    J'ai mis les fichiers à compresser dans un tableau @LesFichiers
    le 1er, donc $LesFichiers[0] s'appelle compress.log.gz


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    use Archive::Extract;
     
    $LECTEUR="C:/";
    $DEST = "$LECTEUR"."temp";
    $SYSLOG="$LECTEUR"."Source"; 
     
    my $ae = Archive::Extract ->new( archive => "$SYSLOG"."/compress.log.gz");
    my $ok = $ae -> extract( to => "$DEST") or die $ae -> error;
     
    print "OK";
    Ce programme marche


    Maintenant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    use Archive::Extract;
     
    $LECTEUR="C:/";
    $DEST = "$LECTEUR"."temp";
    $SYSLOG="$LECTEUR"."Source"; 
    $i=0;
    print "$SYSLOG"."$LesFichiers[$i]";
    print "$SYSLOG"."/compress.log.gz\n" ;
     
    my $ae = Archive::Extract ->new( archive => "$SYSLOG"."$LesFichiers[$i]");
    my $ok = $ae -> extract( to => "$DEST") or die $ae -> error;
     
    print "OK";
    Ne marche pas, c'est très bizarre je trouve
    Les 2 prints des chemins de fichiers indique la même chose

    une idée serait le bienvenue !
    merci !

  2. #2
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    $SYSLOG_DIR n'existe nulle part.
    Pense à mettre un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    use strict; 
    use warnings;
    en début du script, ça t'aidera grandement.

  3. #3
    Futur Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    ok tu avais raison, mais ce n'est pas vraiment le pb, (j'ai mis ce que tu as dis mais plus haut dans mon code)
    je l'ai un peu retouché mais j'ai toujours le même résultat
    les adresses de mes fichiers sont dans $LesFichiers

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    $i=0;
    print "$LesFichiers[$i]";
    print "C:/compress.log.gz\n" ;
     
     
    $ae = Archive::Extract ->new( archive => $LesFichiers[$i]);
     
    $ok = $ae -> extract( to => "$DEST") or die $ae -> error;
     
    print "OK";
    les 2 prints indiquent la même chose
    ce code ne fonctionne pas. En fait je peux décompresser uniquement en rentrant explicitement l'adresse de mon fichier. (mon but est de faire une boucle)

  4. #4
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Au vu de ton script, tu n'as absolument rien changé.
    Le mieux serait de nous mettre le code complet.

  5. #5
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Le constructeur du module attend que tu lui fournisse ton archive ($LesFichiers[$i]).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $ae = Archive::Extract ->new( archive => $LesFichiers[$i]);
    Ensuite il extrait les fichiers vers le répertoire qui tu lui as désigné ($DEST).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my $ok = $ae->extract( to => $DEST) or die $ae -> error;
    Pour avoir les adresses de ces fichiers :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    my $files_ref  = $ae->files;
     
    # Afficher les fichiers
    foreach my $fichier ( @{$files_ref} ) {
      print "- $fichier\n";
    }

  6. #6
    Futur Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    OK pour ton explication,
    si tu veux bien voici la partie nécessaire du 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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
     
    #!/usr/local/bin/perl
     
    use DBI;
    use strict;
    use warnings;
     
    my $LECTEUR="C:\\"; # lecteur d'installation
    my $SYSLOG_DIR="$LECTEUR"."Source"; # répertoire d'installation du fichier syslog à analyser
     
    print "Ouverture du repertoire $SYSLOG_DIR\n";
    opendir (SYSLOGDIR,$SYSLOG_DIR) or die "Impossible d'ouvrir $SYSLOG_DIR";
     
    # ------------------------------------------------------------------------------------------------
    # Fonction lister les fichiers contenus dans $SYSLOG_DIR
    # le nom des fichiers est dans une table : @LesFichiers
    # ------------------------------------------------------------------------------------------------
     
    my @LesFichiers = ListersFichiers($SYSLOG_DIR);
    print "les fichiers a traiter sont :\n";
    print "@LesFichiers";
    my $NbrFichiers = @LesFichiers;
     
    print " Il y a $NbrFichiers fichiers log dans le repertoire\n";
     
     
    sub ListersFichiers
     {
      my ( $SYSLOG_DIR ) = @_;
      my @fichiers;
     
      # Liste fichiers et répertoire sauf (. et ..)
      my @Contenu = grep { !/^\.\.?$/ } readdir(SYSLOGDIR);
     
      # Fermeture du répertoire
      closedir (SYSLOGDIR);
     
      # On récupère tous les fichiers
      foreach my $nom ( @Contenu )
            {
          push ( @fichiers, $SYSLOG_DIR."/$nom\n" );
            }
      return @fichiers;
      }
     
    #------------------------------------------------------------------------------
    #           décompresser fichiers, copie dans C:/temp
    #------------------------------------------------------------------------------
     
    use Archive::Extract;
     
    my $DEST = "$LECTEUR"."/temp";
     
    & ExtraireFichier;
     
    sub ExtraireFichier{
     
    ## je vérifie que les 2 adresses sont les mêmes pour i=0
    my $i=0;
    print "$LesFichiers[$i]\n";
    print "$SYSLOG_DIR"."/compress.log.gz\n" ;
     
    # la je voudrais mettre une boucle pour tous les $i de $LesFichiers
     
    my $ae = Archive::Extract ->new( archive => "$SYSLOG_DIR"."/compress.log.gz");
    #my $ae = Archive::Extract ->new( archive => $LesFichiers[$i]);
     
    # A la place de "$SYSLOG_DIR"."/compress.log.gz" je voudrais $LesFichiers[$i]
     
    my $ok = $ae -> extract( to => "$DEST") or die $ae -> error;
    print "OK";
     
    my $files_ref  = $ae->files;
    # Afficher les fichiers
    foreach my $fichier ( @{$files_ref} ) {
      print "- $fichier\n";
    }}
    ca marche bien mais uniquement si je donne directement le nom du fichier ( au lieux de le chercher dans une table)

    sacré casse tête quand même...
    merci pour ton temps et ta patience

  7. #7
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Que te donne ceci ?

  8. #8
    Futur Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    cela me donne la bonne adresse (le 1er fichier de la liste) :

    c:\source/compress.log.gz

  9. #9
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $LesFichiers[0] =~ s{\\}{/}g;
    Et teste ton code

  10. #10
    Futur Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    Je l'ai testé à plusieurs endroits différents, avec la commande my $ae = Archive::Extract ->new( archive => $LesFichiers[$i]);

    J'ai :

    Key 'archive' <C:/Source/compress.log.gz> is of invalid type for 'Archive::Extract::new' provided by main :: ExtraireFichier at C:/compress.pl line 65
    Can't call method "extract" on an undefined valuee at C:/compress.pl line 69

  11. #11
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Sauf que dans ton code ci-dessus tu as mis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print "C:/compress.log.gz\n" ;
    C:/compress.log.gz ou c:/source/compress.log.gz ?

  12. #12
    Futur Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    je suis fatigué,
    non définitivement, c'est C:/sources/compress.log.gz pour le 1er fichier à décompresser

    et C:\compress.pl pour le logiciel

    c'est trop nul de leur donner le même nom, je note ...
    je peu t'envoyer des fichiers .log.gz si tu veux

  13. #13
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Vas y envoie le car j'arrive pas à reproduire ton souci

  14. #14
    Futur Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    voila donc a mettre sous c:/, dézippé bien sur
    le prog est sous c:/ aussi

    merci bcp

  15. #15
    Responsable Perl et Outils

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

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Tu as codé comme un cochon
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    push( @fichiers, $SYSLOG_DIR . "/$nom\n" );
    au lieu de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    push( @fichiers, $SYSLOG_DIR . "/$nom" );
    Un retour à la ligne qui n'a pas sa place, du coup, le module est incapable de lire le fichier.

    Pour t'en persuader :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    print "==>$LesFichiers[$i]<==\n";
    print "==>$SYSLOG_DIR"."/compress.log.gz<==\n" ;


    Voilà :

    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
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    #!/usr/bin/perl
    use DBI;
    use strict;
    use warnings;
     
    my $LECTEUR    = "C:\\";      # lecteur d'installation
    my $SYSLOG_DIR = "$LECTEUR"  . "Source";    # répertoire d'installation du fichier syslog à analyser
     
    print "Ouverture du repertoire $SYSLOG_DIR\n";
    opendir( SYSLOGDIR, $SYSLOG_DIR ) or die "Impossible d'ouvrir $SYSLOG_DIR";
     
    # ------------------------------------------------------------------------------------------------
    # Fonction lister les fichiers contenus dans $SYSLOG_DIR
    # le nom des fichiers est dans une table : @LesFichiers
    # ------------------------------------------------------------------------------------------------
     
    my @LesFichiers = ListersFichiers($SYSLOG_DIR);
    my $NbrFichiers = @LesFichiers;
    print " Il y a $NbrFichiers fichiers log dans le repertoire\n";
    print "les fichiers a traiter sont :\n";
    foreach ( @LesFichiers ) {
      print "- $_\n";
    }
    #------------------------------------------------------------------------------
    #           décompresser fichiers, copie dans C:/temp
    #------------------------------------------------------------------------------
     
    use Archive::Extract;
    my $DEST = "$LECTEUR" . "/temp";
     
    ExtraireFichier();
     
     
     
     
    sub ExtraireFichier {
     
      # je vérifie que les 2 adresses sont les mêmes pour i=0
      my $i = 0;
      $LesFichiers[$i] =~ s{\\}{/}g;
      print "ExtraireFichier : '",$LesFichiers[$i],"'\n";
      my $ae = Archive::Extract ->new( archive => $LesFichiers[$i]);
      my $ok = $ae->extract( to => "$DEST" ) or die $ae->error;
      my $files_ref = $ae->files;
     
      # Afficher les fichiers
      foreach my $fichier ( @{$files_ref} ) {
        print "- $fichier\n";
      }
    }
     
    sub ListersFichiers {
      my ($SYSLOG_DIR) = @_;
      my @fichiers;
     
      # Liste fichiers et répertoire sauf (. et ..)
      my @Contenu = grep { !/^\.\.?$/ } readdir(SYSLOGDIR);
     
      # Fermeture du répertoire
      closedir(SYSLOGDIR);
     
      # On récupère tous les fichiers
      foreach my $nom (@Contenu) {
        push( @fichiers, $SYSLOG_DIR . "/$nom" );
      }
      return @fichiers;
    }

  16. #16
    Futur Membre du Club
    Inscrit en
    Juillet 2009
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Juillet 2009
    Messages : 16
    Points : 6
    Points
    6
    Par défaut
    oui tu es un chef !
    c'est vrai que je code comme un cochon, en fait c'est mon 1er code en perl
    maintenant je vais pouvoir faire la partie parseur ! (après avoir compris tes modifs)
    tu me dépannes et en plus tu me donnes des leçons
    vraiment merci

Discussions similaires

  1. Réponses: 0
    Dernier message: 17/04/2012, 21h32
  2. Archive::Extract - out of memory
    Par nikita006 dans le forum Modules
    Réponses: 6
    Dernier message: 02/12/2010, 14h58
  3. 7-Zip - Créer un archive auto-extractible.exe
    Par Edoxituz dans le forum Autres Logiciels
    Réponses: 5
    Dernier message: 29/07/2006, 16h27

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