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 :

Zipper un dossier avec tous les sous-dossiers et fichiers


Sujet :

Langage PHP

  1. #1
    Membre confirmé
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Décembre 2019
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : Décembre 2019
    Messages : 67
    Par défaut Zipper un dossier avec tous les sous-dossiers et fichiers
    Hello,

    J'ai développé un bout de code permettant de Zipper un dossier avec tous les sous-dossiers et fichiers.

    Le zip est bien créé et semble contenir tout ce qu'il faut.

    Le problème est qu'il met tous les sous-dossiers au niveau du root de l'archive, et ne respecte donc pas l'arborescence d'origine.

    Je ne comprends pas pourquoi, il me semble que mon code descend d'un niveau dans l'arborescence à chaque fois.

    Auriez-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
    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
     
    <html>
    <?php
    // Function to recursively add a directory,
    // sub-directories and files to a zip archive
     
     
    $Namezip='E:/TEST PHP/A/test.zip';
    $FolderToZip='E:/TEST PHP/Folderazipper/';
    $NameFolderToZip=basename($FolderToZip);
     
    $zip = new ZipArchive;
    $zip->open($Namezip,ZipArchive::CREATE);
     
     
    function addFolderToZip($FolderToZip, $Namezip, $zip){
     
    $NameFolderToZip=basename($FolderToZip);
    echo 'Zippage du dossier '.$NameFolderToZip."<br><br>";
     
    //Test sur le directory
    if (is_dir($FolderToZip)) {
    	//Test sur l'ouverture du directory
    	if ($folderhook = opendir($FolderToZip)) {
    	echo 'Situé dans le path '.$FolderToZip."<br><br>";
    		//Test sur la creation de l'archive
    		echo 'Creation de l\'archive ' .$Namezip ."<br><br>";
    			//Ajout du directory dans l'archive
    			if($zip->addEmptyDir($NameFolderToZip)) {
    			echo 'Création du dossier racine '.$NameFolderToZip."<br><br>";
     
    			// Loop through all the files
                while (($file = readdir($folderhook)) !== false) {
    				echo 'I read the files '.$file."<br><br>";
                    //If it's a folder, run the function again!
                    if(!is_file($FolderToZip . $file)){
                        // Skip parent and root directories
    					echo 'this is a folder '.$FolderToZip . $file."<br><br>";
                        if( ($file !== ".") && ($file !== "..")){
                           addFolderToZip($FolderToZip . $file . "/", $Namezip. $file . "/", $zip);
    						echo 'Je passe dedans'."<br><br>";
    					}
    					else {echo 'Fake directory'."<br><br>";}
                        }
     
    				else{
    					// Add the files
    					$zip->addFile($FolderToZip .$file, $NameFolderToZip.'/' . $file);
    					echo 'I add the files'."<br><br>";
    				}
    			}
    			}
    			else echo 'Impossible to create a new directory in archive';
    		echo 'archive créée !'."<br><br>";
     
     
    	 }
    	 else echo 'Impossible to open directory'."<br><br>";
     
    }
    else echo 'This is not a directory'."<br><br>";
     
    }
     
    addFolderToZip($FolderToZip, $Namezip,$zip);
    		$zip->close();
     
     
    ?>
    </html>

  2. #2
    Expert confirmé
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 554
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 554
    Par défaut
    il y a un souci avec le 2e argument de la fonction. dès le début il ne contient pas une valeur utilisable et ensuite vous ne l'utilisez plus dans votre code à part pour le passer à l'appel récursif suivant.
    ce 2e argument devrait contenir l'arborescence des répertoires dans l'archive et ensuite vous l'utilisez pour ajouter un fichier au bon endroit.

    d'un autre côté, PHP a une classe de parcours récursif des répertoires donc vous pouvez faire comme cela :

    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
     
    $Namezip = '/var/www/html/1/essai/dvlp-zip/test2.zip';
    $FolderToZip = '/var/www/html/1/essai/dvlp-zip/test/';
    //unlink($Namezip);
     
    $NameFolderToZip = basename($FolderToZip);
     
    $zip = new ZipArchive();
    $zip->open($Namezip, ZipArchive::CREATE);
     
     
    $parcours_repertoires = new RecursiveIteratorIterator(
    	  new RecursiveDirectoryIterator($FolderToZip)
    	, RecursiveIteratorIterator::SELF_FIRST
    );
     
     
    foreach ($parcours_repertoires as $e) {
     
    	$nom = $parcours_repertoires->getSubPathName();
     
    	if (!is_file("$FolderToZip/$nom")) {
    		continue;
    	}
     
     
    	echo "ajout de $nom<br/>\n";
     
    	$zip->addFile("$FolderToZip/$nom", "$NameFolderToZip/$nom");
     
    }
     
    $zip->close();

  3. #3
    Membre Expert
    Avatar de cavo789
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2004
    Messages
    1 797
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 797
    Par défaut
    Bonsoir

    Voici un script que j'ai écris il y a quelques années : https://github.com/cavo789/zip_unzip.

    Pleinement fonctionnel; il suffit de le déposer dans un dossier pour que ce dossier et ses sous-dossiers soient archivés.

    Tu peux peut-être t'en inspirer.

    Bonne soirée.

  4. #4
    Membre confirmé
    Homme Profil pro
    Responsable de compte
    Inscrit en
    Décembre 2019
    Messages
    67
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Responsable de compte

    Informations forums :
    Inscription : Décembre 2019
    Messages : 67
    Par défaut
    Problème résolu, merci à tous !

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

Discussions similaires

  1. Lister tous les sous-dossiers d'un répertoire
    Par Invité dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 16/06/2011, 04h34
  2. Réponses: 3
    Dernier message: 22/01/2011, 15h31
  3. [XL-2000] recherche dans tous les sous-dossiers
    Par zandru dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 12/01/2010, 10h32
  4. Réponses: 3
    Dernier message: 29/07/2009, 15h16
  5. Liste de fichiers dans tous les sous dossiers
    Par TaleMaker dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 11/12/2008, 18h29

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