Pas encore de compte ?

Ou connectez vous avec un autre compte

L'inscription à Script-Tout-Fait est gratuite, simple et rapide. Une fois inscrit, vous pourrez proposer vos scripts pour qu'ils apparaissent sur le site ! Notez que le mail de confirmation d'inscription peut mettre du temps à arriver jusqu'à votre boîte mail.

???

Ou connectez vous avec un autre compte

Zipper un dossier ainsi que son contenu

Introduction

Le fonctionnement du script est un peu plus complexe que son utilisation, cependant ce n'est pas terrible. Pour pouvoir comprendre ce script vous devez avoir quelques notions de récursivité. Si vous ne savez pas ce que c'est vous pouvez vous rendre sur ce tutoriel qui vous l'explique.

Le commencement


Commencez par ouvrir le fichier zipper_repertoire_recursif.php.

Vous noterez que la fonction reçoit 5 paramètres dont 2 qui ne doivent jamais être renseignés : $zip et $dossier_base.
Pourquoi ? Tout simplement parce qu'ils reçoivent une valeur par défaut si on ne les renseigne pas (respectivement null et ""). Si vous avez bien retenu ce qu'était une fonction récursive vous comprenez qu'il est difficile de savoir quand la fonction est appelée pour la première fois. Grâce à ces 2 paramètres nous le saurons.
Lors du premier appel à la fonction :

- SI $zip vaut null : on crée le fichier zip (il n'a pas déjà été créé)
Code php
  1.  
  2. if($zip===null) {
  3.         // Si l'archive n'existe toujours pas (1er passage dans la fonction, on la crée)
  4.         $zip = new ZipArchive();
  5.         if($zip->open($nom_archive, ZipArchive::CREATE) !== TRUE) {
  6.                 // La création de l'archive a échouée
  7.                 return false;
  8.         }
  9. }
  10.  


- SI $dossier_base est vide : on lui fait prendre la valeur du dossier de base (celle de $adr_dossier). Lorsque le script continuera, la valeur de $adr_dossier changera, mais pas celle de $dossier_base.
Code php
  1.  
  2. if($dossier_base=="") {
  3.         // Si $dossier_base est vide ça veut dire que l'on rentre
  4.         // dans la fonction pour la première fois. Donc on retient
  5.         // le tout premier dossier (le dossier racine) dans $dossier_base
  6.         $dossier_base=$adr_dossier;
  7. }
  8.  


Le noyau


Suite à ces 3 séries de conditions, on attaque le gros de la fonction. Le listage des fichiers des répertoires. On teste d'abord si le dossier passé en paramètre existe. Ensuite si on arrive à l'ouvrir, et enfin on boucle sur la fonction readdir qui liste le contenu du dossier en excluant le répertoire courant et le répertoire parent (d'où la 3ème condition).
Code php
  1.  
  2. if(file_exists($adr_dossier)) {
  3.         if(@$dossier = opendir($adr_dossier)) {
  4.                 while(false !== ($fichier = readdir($dossier))) {
  5.                         if($fichier != '.' && $fichier != '..') {
  6.  


On attaque maintenant la partie "récursive" de la fonction :
Code php
  1.  
  2. if(is_dir($adr_dossier.$fichier)) {
  3.         $zip->addEmptyDir($adr_dossier.$fichier);
  4.         zipper_repertoire_recursif($nom_archive, $adr_dossier.$fichier, $dossier_destination, $zip, $dossier_base);
  5. }
  6. else {
  7.         $zip->addFile($adr_dossier.$fichier);
  8. }
  9.  

Ce code signifie :
- si le fichier que l'on est en train de scanner est en réalité un répertoire, on ajoute un répertoire vide dans le zip et on fait appel à la même fonction (zipper_repertoire_recursif) en lui passant les nouveaux paramètres pour qu'elle scanne le sous dossier. Les variables $zip et $dossier_base ne prendront pas les valeurs par défaut dans ces nouveaux appels de fonction.
- sinon le fichier en est bien un, on l'ajoute dans le zip

Fin puis déplacement


Les quelques lignes à la fin de la fonction ne servent qu'à clore le zip, puis si le dossier de destination a été renseigné (je vous rappelle que ce paramètre est facultatif), on le déplace dans le dossier voulu grâce à la fonction rename :
Code php
  1.  
  2. if($dossier_base==$adr_dossier) {
  3.         // On ferme la zip
  4.         $zip->close();
  5.  
  6.         if($dossier_destination!='') {
  7.                 if(substr($dossier_destination, -1)!='/') {
  8.                         // Si l'adresse du dossier ne se termine pas par '/', on le rajoute
  9.                         $dossier_destination .= '/';
  10.                 }
  11.                        
  12.                 // On déplace l'archive dans le dossier voulu
  13.                 if(rename($nom_archive, $dossier_destination.$nom_archive)) {
  14.                         return true;
  15.                 }
  16.                 else {
  17.                         return false;
  18.                 }
  19.         }
  20.         else {
  21.                 return true;
  22.         }
  23. }
  24.