2013-05-13 5 views
1

Je crée une méthode qui procédera à l'inspection des fichiers dans un dossier de téléchargement et certains de ces fichiers sont des archives (tar, tar.gz, zip, rar, etc). Je voudrais lire ces fichiers d'archives et lister tous les fichiers dans un format d'arbre imbriqué.fichiers liste récursive dans une archive

Par exemple, j'ai un fichier d'archive appelé sandwich.tar.gz, je voudrais qu'il apparaisse comme suit: -

sandwich.tar.gz 
    lettuce 
    mayonaise 
    cheese 
    bread (directory) 
     wholemeal 

Mon code jusqu'ici: -

<?php $archive = new PharData('/upload/directory/sandwich.tar.gz'); 
foreach($archive as $file) { 
     echo $file . "<br />"; 
} 

Mais il n'a pas réussi à liste les fichiers dans le répertoire bread. Comment puis-je réparer ça?

Répondre

-2

Certains conseils qui m'ont été donnés une fois, et qui me viennent souvent à l'esprit, me viennent à l'esprit: le code fera EXACTEMENT ce que vous lui demandez de faire: rien de plus, rien de moins.

Demandez à la machine: 'S'il s'agit d'un répertoire, veuillez en afficher le contenu?'

Votre fonction pense qu'elle recherche un fichier $, et affiche donc le nom de ce fichier.

Tenez compte http://php.net/manual/en/function.readdir.php et http://www.php.net/manual/en/function.is-dir.php

+0

La question est à propos de lire une archive tar, pas un simple répertoire. – djleop

2

Bien que cette question est assez ancienne, compte tenu de la stupidité et l'inutilité de la réponse précédente, je ne peux que répondre.

Il semble tout PHP fait est toujours au mieux non standard et maladroit ...

vous l'avez droit d'inspecter le premier niveau. Cependant, les objets retournés à partir de l'itération ne sont pas du même type, donc appeler foreach sur eux conduira à l'échec.

L'écriture d'un objet PharData vous donne PharFileInfo. De là, vous pouvez vérifier le type de fichier (en vérifiant s'il s'agit d'un répertoire avec la méthode isDir() héritée).

À partir de là, vous devrez créer un autre objet Phar sur le chemin de la ressource obtenue à partir du (également hérité) getPathname() (sic , pas getPathName() dire les docs!) Méthode. Vous pourrez alors itérer dessus ...

Exemple complet:

<?php 
    $archive = new PharData('/upload/directory/sandwich.tar.gz'); 
    foreach($archive as $file) { 
     echo $file; 
     if($file->isDir()) { 
      echo ':'; 
      $dir = new PharData($file->getPathname()); 
      foreach($dir as $child) { 
       echo "<br />$child"; 
      } 
     } 
     echo "<br />"; 
    } 
?> 

Bien sûr, cela tue récursion facile si vous avez plusieurs niveaux dans vos archives. Vous devrez cuisiner votre propre robot ... récursive

0

Vous pouvez le faire en utilisant un RecursiveIteratorIterator, car PharData étend la classe Phar et la classe Phar étend la classe RecursiveDirectoryIterator:

$archive = new PharData('/upload/directory/sandwich.tar.gz'); 

foreach (new RecursiveIteratorIterator($archive) as $file) { 
    echo $file . "<br />"; 
} 
Questions connexes