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 :

Extraire un ZIP sans garder l'arborescence


Sujet :

Langage PHP

  1. #1
    Membre à l'essai
    Inscrit en
    Avril 2013
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 44
    Points : 24
    Points
    24
    Par défaut Extraire un ZIP sans garder l'arborescence
    Bonjour à tous,

    J'essaye en ce moment d'extraire un fichier zip contenant plusieurs dossiers, mon arborescence ayant une racine, des dossiers contenant des dossiers qui eux contiennent le contenu que je veux récupérer.

    Jusque là j'utilise ce code qui permet d'extraire dans le dossier uploads, tout en gardant l'arborescence.
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    $za = new ZipArchive(); 
     
     $za->open("01_BG.zip"); 
    for ($i=0; $i<$za->numFiles;$i++) {
        echo "index : $i\n";
        print_r($za->statIndex($i));
    }
    $za->extractTo('./uploads');
    $za->close();
    echo "OKKK";
    ?>

    J'ai remarqué grâce au print_r que les dossiers avait l'attribut "size"=0 mais malgré quelques essais tels que
    Code php : 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
    $zip = zip_open("01_BG.zip");
    if ($zip) {
        while ($zip_entry = zip_read($zip)) {
    		if(zip_entry_filesize($zip_entry)==0){
    			while(zip_entry_filesize(zip_read($zip))==0){
    				zip_read($zip);
     
    				if(zip_entry_filesize(zip_read($zip))!==0){
    					while(zip_entry_filesize(zip_read($zip))!==0){
    				echo zip_entry_name(zip_read($zip)). "\n";
    				zip_read($zip);
    				echo zip_entry_name(zip_read($zip)). "\n";			
    					}
    				}
    			}
    		}
    	}
    je n'ai pas réussi à récupérer seulement le contenu.

    Des idées ?

    Merci d'avance,
    Susumu

  2. #2
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2009
    Messages
    736
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2009
    Messages : 736
    Points : 1 101
    Points
    1 101
    Par défaut
    Tu pourra créer un fonction récdursive qui bouclé sur la racine si il trouve un dossier il entre dans le dossier puis il refais la meme chose jusqu'a se qu'il tombe sur un fichier

  3. #3
    Membre à l'essai
    Inscrit en
    Avril 2013
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 44
    Points : 24
    Points
    24
    Par défaut
    (j'ai mis à jour mon message juste après que tu aies répondu)

    C'est ce que j'essaye de faire dans le code plus haut, si la taille du fichier est 0, il le passe, mais le résultat est très peu concluant. Il y a une façon simple de repérer qu'on a à faire à un dossier et non un fichier ?

  4. #4
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2009
    Messages
    736
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2009
    Messages : 736
    Points : 1 101
    Points
    1 101
    Par défaut
    Voici un exemple qui supprime tous les fichier d'une arborescence, tu peux le changé pour avoir ce que tu veux
    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
     
    $path = '/';
    remove_file($path);
     
     
    function remove_file($path)
    {
    	$handle = @opendir($path);
     
    	while ($file = @readdir($handle))
    	{
    		if ($file != '.' && $file != '..')
    		{
    			if (!is_dir($path . "/" . $file))
    			{
    				unlink($path . "/" . $file);
    				//echo $path . "/" . $file . '<br />';
    			}
    			else
    			{
    				remove_file($path . "/" . $file);
    			}
    		}
    	}
    	@closedir($path);
    }

  5. #5
    Membre à l'essai
    Inscrit en
    Avril 2013
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 44
    Points : 24
    Points
    24
    Par défaut
    Très bien, je l'adapte et si je rencontre un soucis, je reviens à toi.

    Merci beaucoup !

  6. #6
    Membre à l'essai
    Inscrit en
    Avril 2013
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 44
    Points : 24
    Points
    24
    Par défaut
    Alors suite à des essais,j'arrive à extraire un fichier zip, copier tous les fichiers dans le dossier souhaité et supprimer le dossier extrait du zip une fois vide!

    Mais ça ne fonctionne que si le dossier ne contient aucun dossier et sur ce point je bloque..

    Voilà le code jusque là
    Code php : 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
    $za = new ZipArchive(); 
     
    $za->open("archive.zip"); 
    for ($i=0; $i<$za->numFiles;$i++) {
        echo "index : $i\n";
        print_r($za->statIndex($i));
    }
    $za->extractTo('./uploads');
    $za->close();
     
    $dir='./uploads/archive';
    rrmdir($dir);
    // removes files and non-empty directories
    function rrmdir($dir) {
    $src=$dir;
    $dst='uploads';
      if (is_dir($dir)) {
        $files = scandir($dir);
        foreach ($files as $file)
        if ($file != "." && $file != "..")
    	{	
    	rcopy("$src", "$dst");
    	unlink("$dir/$file");
    	}
     
        rmdir($dir);
      }
     
    } 
     
    // copies files and non-empty directories
    function rcopy($src, $dst) {
      if (is_dir($src)) {
        $files = scandir($src);
        foreach ($files as $file)
        if ($file != "." && $file != "..")		rcopy("$src/$file", "$dst/$file"); 
     
      }
    	else copy($src, $dst);
    }

    Un petit coup de main pour m'aider à terminer ? J'ai essayé des choses horribles (horribles !) tels que
    Code php : 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
    function rrmdir($dir) {
    $src=$dir;
    $dst='uploads';
    	if (is_dir($dir)) {
    		$files = scandir($dir);
    		foreach ($files as $file)
    			if (is_dir($file))
    			{	
    				$files1=  scandir($file);
    				foreach($files1 as $file1)
    				if(is_dir($file1)){
    					$files2=scandir($file1);
    					foreach($files2 as $file2)
    						if ($file2 != "." && $file2 != "..")
    						{	
    							rcopy("$src", "$dst");
    							unlink("$dir/$file");
    						}
    						rmdir($file1);
    				}
    				rmdir($file);				
     
    			}
     
        rmdir($dir);
    	}
     
     }

    Mais à part avoir obtenu ce qui ressemble à une boucle infinie, je n'ai pas réussi à grand chose..

  7. #7
    Membre éprouvé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2009
    Messages
    736
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2009
    Messages : 736
    Points : 1 101
    Points
    1 101
    Par défaut
    Essai avec ça
    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
    $dir='./uploads/archive';
    rrmdir($dir);
     
    function rrmdir($path)
    {
    	$handle = @opendir($path);
     
    	while ($file = @readdir($handle))
    	{
    		if ($file != '.' && $file != '..')
    		{
    			if (!is_dir($path . "/" . $file))
    			{
    				copy($path . "/" . $file, $dst);
    				unlink($path . "/" . $file);
    			}
    			else
    			{
    				remove_file($path . "/" . $file);
    			}
    		}
    	}
    	@closedir($path);
    	@rmdir($path);
    }

  8. #8
    Membre à l'essai
    Inscrit en
    Avril 2013
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 44
    Points : 24
    Points
    24
    Par défaut
    Rebonjour, alors en adaptant ta solution ce qui me donne
    Code php : 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
    $path='./uploads/01_BG';
    rrmdir($path);
    // removes files and non-empty directories
    function rrmdir($path)
    {
    $dst='uploads';
    	$handle = @opendir($path);
     
    	while ($file = @readdir($handle))
    	{
    		if($file=='Thumbs.db') unlink($path . "/" . $file);
    		if ($file != '.' && $file != '..' && $file != 'Thumbs.db')
    		{
    			if (!is_dir($path . "/" . $file))
    			{
    				copy($path . "/" . $file, $dst."/".$file);
    				unlink($path . "/" . $file);
    			}
    			else
    			{
    				rrmdir($path . "/" . $file);
    			}
    		}
     
    	}
    	@closedir($path);
    	@rmdir($path);
    }
    Tout est bien copier mais mon arborescence de test ayant un dossier, contenant 2 dossiers, contenant chacun 1 dossier qui contient les fichiers, seuls les 2 dossiers contenant les fichiers sont supprimés et pas la racine ni le père de chacun des dossiers supprimés. (pas sûr d'être clair..)

    J'ai donc ajouté une fonction clean pour supprimer ces dossiers et une suppression de la racine après la fonction.

    Code php : 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
    $path='./uploads/01_BG';
    rrmdir($path);
    clean($path);
    @opendir($path);
    @closedir($path);
    rmdir($path);
     
    function clean($path){
    	$handle = @opendir($path);
     
    	while ($file = @readdir($handle))
    	{
    		if ($file != '.' && $file != '..')
    		{
    			if (is_dir($path . "/" . $file)) clean($path . "/" . $file);
    		}
    	}
    	@closedir($path);
    	@rmdir($path);
    }

    Ça fonctionne dans ce cas, mais évidemment comme j'ai codé avec les pieds, s'il y a plus de dossiers, ça ne fonctionne plus..

  9. #9
    Membre à l'essai
    Inscrit en
    Avril 2013
    Messages
    44
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 44
    Points : 24
    Points
    24
    Par défaut
    J'ai modifié
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    @opendir($path);
    @closedir($path);
    rmdir($path);

    Par
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(@opendir($path)){
    while(@opendir($path))
    clean($path);
    }

    Ce qui doit être encore plus dégueulasse mais au moins ça fonctionne qu'importe l'arborescence ! Si tu as une solution plus propre je suis preneur, mais au moins ça fonctionne enfin

    Merci pour l'aide en tous les cas.

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

Discussions similaires

  1. archive tar sans garder l'arborescence du repertoire
    Par crazykangourou dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 19/02/2008, 11h02
  2. Compression d'un dossier en tar.gz sans garder l'arborescence
    Par MagicManu dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 21/03/2007, 08h53
  3. Tester un zip sans l'ouvrir
    Par miloux32 dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 20/07/2006, 16h20
  4. Réponses: 2
    Dernier message: 03/05/2006, 15h33
  5. [Zip] Comment Extraire un zip en php
    Par djshaker dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 20/10/2004, 11h25

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