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 PHP Discussion :

Librairie ZIP : lecture élements d'un dossier


Sujet :

Langage PHP

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 11
    Points : 4
    Points
    4
    Par défaut Librairie ZIP : lecture élements d'un dossier
    Bonjour,
    Je rencontre un soucis quant à la lecture de fichier zip.
    Mon problème est le suivant : Je voudrais afficher tous les fichiers d'un dossier contenu dans une archive.
    Quand j'utilise la boucle ci-dessous, mon problème est qu'il liste tous les fichiers et tous les dossiers de l'archive. Moi je voudrai afficher que les fichiers/noms des dossiers du dossier /TEST/ de l'archive par exemple.
    Avez vous une idée?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    $zip = zip_open("archive.zip");
    if ($zip) {
    	while($zip_entry = zip_read($zip)) {		
    		if(substr(zip_entry_name($zip_entry),-1)=="/") {
    			echo "Dossier : ".zip_entry_name($zip_entry)."<br />";
    		}
    		else 
    			echo "Nom : " . zip_entry_name($zip_entry) . "<br>";
     
         }
    }
    Voila mon code actuel, mais il affiche tous les éléments de l'archive et non pas un dossier spécifique. Je n'ai pas trouvé comment se placer dans un dossier de l'archive.


    Merci d'avance,

    Nicolas

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    j'ai fais une petite lib pour ca : https://github.com/stealth35/Stdlib
    regarde la ZipArchiveIterator ça marche comme DirectoryIterator

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    Merci beaucoup, mais est ce qu'il serai possible d'avoir plus de détail?
    Comment j'installe la librairie? Et un exemple de l'utilisation? Le README est vide.


    Bonne journée et merci beaucoup pour ton aide.

    Nico

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    déjà faut être en PHP 5.3, apres c'est de l'installe standard
    (dossier library, le rajouter dans l'included path, puis faire un spl_autoload_register)

    pour l'utilisation c'est comme DirectoryIterator mais version wrapper zip donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    set_include_path('../Stdlib/library' . PATH_SEPARATOR . get_include_path());
    spl_autoload_register();
     
    $zip = new Stdlib\ZipArchiveIterator('test.zip#test/');
    foreach($zip as  $file)
    {
        var_dump($file->getFilename());
    }

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    D'accord, je vais essayer et je te tien au courant.

    Merci !

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    Je n'ai pas réussi, j'ai du mal faire quelque chose. Voici ce que j'ai fais. J'ai mis le code ci-dessous dans un fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    // ./library étant le dossier contenant la librairie
    set_include_path(./library' . PATH_SEPARATOR . get_include_path());
    spl_autoload_register();
    $zip = new Stdlib\ZipArchiveIterator('test.zip#test/');
    foreach($zip as  $file)
    {
    	echo "lol";
        var_dump($file->getFilename());
    }
    et j'obtiens cette erreur :
    Fatal error: spl_autoload() [<a href='function.spl-autoload'>function.spl-autoload</a>]: Class Stdlib\ZipArchiveIterator could not be loaded in /Users/Nicoco/Sites/stage/test2.php on line 18
    La ligne 18 étant la ligne correspondant à la déclaration de la variable zip.

    Mais à ce que j'ai compris, cette librairie se charge de filtrées les entrées de l'archive?
    Parce que mon problème est que mon archive possède plus de 100 000 fichiers. Or avec zip_read() on ne peut qu'avoir 2^16 entrées maximum. Comment faire?

  7. #7
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    le dossier library est au moment niveau que ton script ? t'as bien PHP 5.3.3+

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    Oui il est bien à la racine et non j'ai php 5.3.2.
    Je vais essayer alors avec php 5.3.3 !

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    C'est ok avec la version 5.3.3, merci beaucoup !
    Mais comme expliqué précédement, j'ai plus de 100 000 fichiers dans l'archive et donc je n'arrive pas à tout traité. Avez vous une solution à mon problème?

    Voici le message d'erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 523800 bytes) in /Users/xxx/Sites/stage/test/stdlib/ziparchiveiterator.php on line 77

  10. #10
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    aie ouai il a pas l'air de trop aimer

    si veux des classes plus simple (avec juste le nom des fichiers) utilise : ZipDirectoryIterator ou RecursiveZipDirectoryIterator, si tu veux des chose bien precise, fait un RegexIterator sur ZipArchiveIterator

    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
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    class ZipArchiveIterator implements Iterator
    {
        private $_zip;
        private $_current;
        private $_position;
     
        public function __construct($file_name)
        {
            $this->_zip = new ZipArchive();
            $ret = $this->_zip->open($file_name);
     
            if(true !== $ret)
            {
                $message = sprintf('zip error', $ret);
                throw new \RuntimeException($message);
            }
     
            $this->_position = 0;
            $this->next();
        }
     
        public function current()
        {
            return $this->_current;
        }
     
        public function key()
        {
            return $this->_position;
        }
     
        public function next()
        {
            $stat = $this->_zip->statIndex($this->_position);
     
            if(is_array($stat))
            {
                $this->_current = $stat['name'];
                ++$this->_position;
            }
            else
            {
                $this->_current = false;
            }
        }
     
        public function rewind()
        {
            $this->_position = 0;
            $this->next();
        }
     
        public function valid()
        {
            return $this->_current;
        }
     
        public function __destruct()
        {
            $this->_zip->close();
        }
    }
     
    class ZipDirectoryIterator extends FilterIterator
    {    
        private $_dir_name;
     
        public function __construct($file_name, $dir_name)
        {
            parent::__construct(new ZipArchiveIterator($file_name));
            $this->_dir_name = $dir_name;
        }
     
        public function accept()
        {
            $filename = $this->getInnerIterator()->current();
     
            return dirname($filename) . '/' === $this->_dir_name;
        }
    }
     
    class RecursiveZipDirectoryIterator extends FilterIterator
    {    
        private $_dir_name;
     
        public function __construct($file_name, $dir_name)
        {
            parent::__construct(new ZipArchiveIterator($file_name));
            $this->_dir_name = $dir_name;
        }
     
        public function accept()
        {
            $filename = $this->getInnerIterator()->current();
     
            return strpos(dirname($filename) . '/', $this->_dir_name) === 0;
        }
    }

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    Je me suis débrouillé autrement, je n'ai pas trouvé de solution efficace.
    Merci quand même !

  12. #12
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 727
    Points
    10 727
    Par défaut
    le dernier code plante aussi ?

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

Discussions similaires

  1. Quelle est pour vous la meilleure librairie ZIP ?
    Par julien_chable dans le forum Entrée/Sortie
    Réponses: 9
    Dernier message: 04/07/2008, 19h50
  2. Réponses: 6
    Dernier message: 21/10/2007, 00h19
  3. [Librairies] zip.lib.php Fatal error: Allowed memory size of 8388608 bytes exhausted
    Par manaboko dans le forum Bibliothèques et frameworks
    Réponses: 9
    Dernier message: 22/05/2006, 10h42
  4. Problème d'attribut de lecture seule sur des dossiers
    Par Redbull dans le forum Sécurité
    Réponses: 2
    Dernier message: 09/08/2005, 09h52
  5. [librairie zip] problème manipulation archive
    Par winnux dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 13/07/2005, 12h08

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