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 :

Création d'un ZIP de dossier [perl6]


Sujet :

Langage Perl

  1. #1
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2012
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2012
    Messages : 18
    Points : 11
    Points
    11
    Par défaut Création d'un ZIP de dossier
    Bonjour,

    je tente de faire un script me permettant de créer un zip de n fichiers d'un répertoire. Ce zip ne contenant que les fichiers et non pas le dossier source.

    Voici le code que j'ai fait :
    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
     
    #!C:\Perl64\bin\
     
    use strict;
    use warnings;
    use autodie;
    use File::Copy qw/ copy /;
    use File::Basename ;
    use Archive::Zip 	qw( :ERROR_CODES :CONSTANTS );
     
    # Global Variable
    my $DIROUT = './FileResult/';
     
    # Partie ZIPPAGE du répertoire contenant les ressources sans Exstension
    opendir(DIROUT, $DIROUT) or die $!;
    my $ZipCreated=qw(./FileZipped/Archive.zip);
     
    my $RC = 0;
    my $ZipFile = Archive::Zip->new() or $RC=1; 
     
    my @ListFilesToZip = glob ($DIROUT);
     
    foreach my $File (@ListFilesToZip)
    	{
    		$ZipFile -> addFile ($File) ;
    	}
     
    if ($ZipFile->writeToFileNamed($ZipCreated) != AZ_OK )
    	{
    		$RC=2;
    	}
     
    	print "Fin de l'ecriture du fichier Archive avec le code [$RC]!\n";
    A la suite de l'exécution de ce script, je me retrouve avec cette erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Can't call method "desiredCompressionLevel" on an undefined value at C:/Perl64/lib/Archive/Zip/Archive.pm line 256.
    Cette erreur disparaît lorsque j'écris la ligne "addFile" ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ZipFile -> addFile ("$DIROUT/$File") ;
    Sauf que le zip produit contient le dossier "FileResult" en amont des fichiers, ce que je ne veux pas.

    Auriez-vous une idée pour me dépatouiller, svp ?

  2. #2
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    En lisant la doc de Archive::Zip, tu as directement la solution:
    addFile( { filename => $fileName [, zipName => $newName, compressionLevel => $compressionLevel } ] )
    Le deuxième paramètre de la méthode addFile te permet de spécifier le nom souhaité du fichier dans l'archive.
    Donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ZipFile -> addFile ("$DIROUT/$File", $File) ;
    (Bien sûr, une autre solution consisterait à définir le répertoire dans lequel se trouvent les fichiers comme répertoire courant.)
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  3. #3
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2012
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2012
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    Bonjour CosmoKnacki,

    tout d'abord, merci de ta réponse.

    j'ai bien tenté ta ligne de code mais je me retrouve toujours avec la même réponse.

  4. #4
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Et en étant plus explicite: $ZipFile -> addFile ("$DIROUT/$File", "./$File") ; voire $ZipFile -> addFile ( { filename => "$DIROUT/$File", zipname => "./$File"} ) ; ça donne quoi?
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  5. #5
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2012
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2012
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    Bonjour CosmoKnacki,

    que ce soit avec la première ou la seconde des nouvelles lignes de code, ça me renvoie toujours la même erreur et le zip n'est pas créé.

    Pour aider un peu, je mets le code de la méthode addFile contenue dans le fichier Archive.pm

    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
     
    sub addFile {
        my $self = shift;
     
        my ($fileName, $newName, $compressionLevel);
        if (ref($_[0]) eq 'HASH') {
            $fileName         = $_[0]->{filename};
            $newName          = $_[0]->{zipName};
            $compressionLevel = $_[0]->{compressionLevel};
        } else {
            ($fileName, $newName, $compressionLevel) = @_;
        }
     
        if ($^O eq 'MSWin32' && $Archive::Zip::UNICODE) {
            $fileName = Win32::GetANSIPathName($fileName);
        }
     
        my $newMember = Archive::Zip::Member->newFromFile($fileName, $newName);
        $newMember->desiredCompressionLevel($compressionLevel);
        if ($self->{'storeSymbolicLink'} && -l $fileName) {
            my $newMember =
              Archive::Zip::Member->newFromString(readlink $fileName, $newName);
     
      # For symbolic links, External File Attribute is set to 0xA1FF0000 by Info-ZIP
            $newMember->{'externalFileAttributes'} = 0xA1FF0000;
            $self->addMember($newMember);
        } else {
            $self->addMember($newMember);
        }
     
        return $newMember;
    }
    La fameuse ligne "256" qui pose problème est celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $newMember->desiredCompressionLevel($compressionLevel);
    J'ai également tenté avec ces 2 lignes mais sans succès :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $ZipFile -> addFile ( { filename => "$DIROUT/$File", zipname => "./$File", compressionLevel => 0} ) ;
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $ZipFile -> addFile ($File, $File, 0) ;

  6. #6
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2012
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2012
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    ça y est, cela fonctionne !

    j'ai modifié une ligne en amont de mon appel à "addFile".

    Pour faire le listing des fichiers à zipper, je faisais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my @ListFilesToZip = glob ($DIROUT);
    Mais, en changeant par ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    my @ListFilesToZip = grep !/(?:^\.$)|(?:^\.\.$)/, readdir DIROUT;
    et en utilisant les lignes de code de CosmoKnacki, je n'ai plus l'erreur "desiredCompressionLevel".

    Par contre, j'ai 2 comportements différents selon la ligne de code lorsque je décompresse avec Winzip le zip créé précédemment.

    Avec celle-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ZipFile -> addFile ( { filename => "$DIROUT/$File", zipname => "./$File" } ) ;
    Les fichiers sont dézippés après création d'un répertoire "réceptacle"

    Avec celle-là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ZipFile -> addFile ("$DIROUT/$File", "./$File") ;
    Les fichiers sont dézippés à la racine du fichier zip => c'est ce que je voulais !!

    @CosmoKnacki : Merci encore de ton aide !!

    PS : le sujet peut être clos ... je ne sais pas comment faire

  7. #7
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 858
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 858
    Points : 6 556
    Points
    6 556
    Par défaut
    Citation Envoyé par yodaragorn Voir le message
    Les fichiers sont dézippés après création d'un répertoire "réceptacle"
    Je crois qu'il faut écrire zipName et non pas zipname.

    Du coup, je ne suis pas persuadé que le ./ soit utile avant $File.

    my @ListFilesToZip = grep !/(?:^\.$)|(?:^\.\.$)/, readdir DIROUT; peut s'écrire plus simplement: my @ListFilesToZip = grep !/^\.\.?$/, readdir DIROUT;
    Brachygobius xanthozonus
    Ctenobrycon Gymnocorymbus

  8. #8
    Membre à l'essai
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2012
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2012
    Messages : 18
    Points : 11
    Points
    11
    Par défaut
    j'ai testé ton idée avec cette ligne de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ZipFile -> addFile ( { filename => "$DIROUT/$File", zipName => "$File" } ) ;
    et cela fonctionne également ; le dézippage produit des fichiers à la racine et non plus dans un dossier "réceptacle".

    Merci encore !

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

Discussions similaires

  1. Création d'un numéro de dossier
    Par guenfood dans le forum VBA Access
    Réponses: 9
    Dernier message: 30/11/2007, 10h19
  2. Création de fichier et de dossier
    Par bouzaidi dans le forum C++
    Réponses: 12
    Dernier message: 24/07/2007, 23h58
  3. IllegalStateException après la création d'un zip
    Par GreenJay dans le forum Struts 1
    Réponses: 3
    Dernier message: 19/07/2007, 15h16
  4. Création d'une arborescence de dossiers
    Par guidzit dans le forum Access
    Réponses: 4
    Dernier message: 25/09/2006, 09h14
  5. [Zip] Problème de création d'archives (Zip.lib.php)
    Par BOUHAMOU dans le forum Bibliothèques et frameworks
    Réponses: 15
    Dernier message: 24/04/2006, 12h51

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