Lister récursivement le contenu d'un répertoire en PHP
Par NiKo le mardi 19 juillet 2005, 16:23 - Dev
- Lien permanent -
18 commentaires -
Tags :
Beaucoup de personnes arrivent sur ce site via Google en demandant une fonction php de listing d'un répertoire. N'aimant pas décevoir les gens, voici la fonction que j'utilise personnellement 
Comme dirait Desproges, pouf pouf ! J'ai mis à jour la fonction pour y incorporer plus d'infos sur les fichiers (un stat() en fait). Bon toutes ces aventures m'ont motivé pour faire un set de classes perso avec toutes ces vielleries vieilles fonctions que j'utilise aveuglément depuis quelques années. Quitte à modifier les signatures, je suis un fou, moi ![]()
Evidemment, je redistriburerai le tout quand je serais satisfait du résultat 
<?php /** * @function read_dir * @author Nicolas Perriault - www.prendreuncafe.com * @version 0.2 * <p>Read the files list of a folder recursively and returns it as an array.</p> * @param string path Chemin du repertoire à lister recursivement * @param boolean full_list Afficher les entrées . et .. * */ function read_dir($path='.', $full_list=false) { $out = array(); $i = 0; $path = substr($path, strlen($path) - 1, strlen($path)) !== '/' ? $path.'/' : $path; if (!is_dir($path) || !$handle = @dir($path)) { trigger_error('\''.$path.'\' doesn\'t exists or is not a valid directory', E_USER_ERROR); } else { while ($entry = $handle->read()) { if ($full_list == true || ($entry !== "." && $entry !== "..")) { $path_to_entry = $path.'/'.$entry; if ($entry !== '.' && $entry !== '..' && @is_dir($path_to_entry)) { $out[$entry] = read_dir($path_to_entry, $full_list); } else { $out[$entry] = stat($path_to_entry); if (function_exists('mime_content_type')) { $out[$entry]['mimetype'] = mime_content_type($path_to_entry); } } } } } return $out; } // Exemple d'utilisation : echo '<p>Ce dossier contient :</p>'; echo '<pre>'; print_r(read_dir('mon_dossier/de_test')); echo '</pre>'; ?>
Hope it helps 
Edit : un exemple de sortie
Juste pour illustrer la récursivité :
Ce dossier contient :
Array
(
[rep1] => Array
(
[foo.txt] => Array
(
[0] => 2049
[1] => 13685171
[2] => 33188
[3] => 1
[4] => 33
[5] => 33
[6] => 0
[7] => 16
[8] => 1121786274
[9] => 1121786274
[10] => 1121786274
[11] => 131072
[12] => 8
[dev] => 2049
[ino] => 13685171
[mode] => 33188
[nlink] => 1
[uid] => 33
[gid] => 33
[rdev] => 0
[size] => 16
[atime] => 1121786274
[mtime] => 1121786274
[ctime] => 1121786274
[blksize] => 131072
[blocks] => 8
)
[ssrep1] => Array
(
[foo.txt] => Array
(
[0] => 2049
[1] => 13685203
[2] => 33188
[3] => 1
[4] => 33
[5] => 33
[6] => 0
[7] => 16
[8] => 1121786295
[9] => 1121786295
[10] => 1121786295
[11] => 131072
[12] => 8
[dev] => 2049
[ino] => 13685203
[mode] => 33188
[nlink] => 1
[uid] => 33
[gid] => 33
[rdev] => 0
[size] => 16
[atime] => 1121786295
[mtime] => 1121786295
[ctime] => 1121786295
[blksize] => 131072
[blocks] => 8
)
)
[ssrep2] => Array
(
[foo.txt] => Array
(
[0] => 2049
[1] => 13685176
[2] => 33188
[3] => 1
[4] => 33
[5] => 33
[6] => 0
[7] => 16
[8] => 1121786277
[9] => 1121786277
[10] => 1121786277
[11] => 131072
[12] => 8
[dev] => 2049
[ino] => 13685176
[mode] => 33188
[nlink] => 1
[uid] => 33
[gid] => 33
[rdev] => 0
[size] => 16
[atime] => 1121786277
[mtime] => 1121786277
[ctime] => 1121786277
[blksize] => 131072
[blocks] => 8
)
[bar.txt] => Array
(
[0] => 2049
[1] => 13685193
[2] => 33188
[3] => 1
[4] => 33
[5] => 33
[6] => 0
[7] => 16
[8] => 1121786288
[9] => 1121786288
[10] => 1121786288
[11] => 131072
[12] => 8
[dev] => 2049
[ino] => 13685193
[mode] => 33188
[nlink] => 1
[uid] => 33
[gid] => 33
[rdev] => 0
[size] => 16
[atime] => 1121786288
[mtime] => 1121786288
[ctime] => 1121786288
[blksize] => 131072
[blocks] => 8
)
)
)
)
Sinon, note à moi même en gras, il faut que je me penche plus sérieusement sur PHP5.










18 commentaires (Ajouter un commentaire)
tu peux aussi faire ça avec la SPL de PHP5 :
try { $dir = new directoryIterator('.'); foreach($dir as $value) { echo $value, '<br/>'; } } catch (Exception $e) { echo $e; }là c'est un exemple non recursif mais il existe les méthodes recursives aussi, c'est la version OO de ta fonction ...
fr2.php.net/manual/fr/ref...
J'en connais un qui si il passait là te dirait d'utiliser glob() ^^
Wow je connaissais pas : ça rox ! Faut vraiment que je mette PHP5 en prod
Edit: Je répondais à Tatane, solo t'es trop rapide
M'appelles pas Tatane on m'appelait comme ça au lycée
moi ce pseudo est arrivé un peu aprés le lycée
lol, t'avais juste à continuer ta recherche et tu tombais sur une fonction bien moins compliqué que la tienne et en plus elle est vieille
:
xethorn.net/?codes/php
En bon geek, j'utilise une unique instruction pour remplir un tableau avec le contenu d'un répertoire :
for($list = array(), $dir = opendir('./'); $list[] = readdir($dir););
Ca doit être extensible en récursif, en cherchant bien...
Arf, le démon du oneliner
C'est vrai que le oneliner ça rox, mais débuguer un code entièrement comme ça c'est l'arrachage de cheveux assuré
Nico > Exactement
Un "one-liner", ça se débuggue pas. C'est tellement atomique, que soit ça marche, soit... ça n'existe pas. Le tout reste à coller ça dans une fonction avec un joli commentaire qui indique EXACTEMENT ce que fait la fonction.
AMHA, il est hors de question de coder une appli ou un site avec une suite de oneliners imbittables, mais on PEUT les utiliser sous forme de briques qui n'altèrent pas la lisibilité. D'autant que la fonction sous forme d'une ligne peut être modifiée par la suite et mise sous forme "humainement compréhensible" pour corriger un bug, sans pour autant modifier le code du script appelant.
Vieux Haïku Perl :
"wrote a script in may
this damn program broke today
can't grok[1] my own code"
--
[1] - en.wikipedia.org/wiki/Gro...
Interessante discussion
Perso j'envisage plus une brique comme une fonction ou mieux, comme une classe nanties de méthodes et de propriétés... Et l'expérience aidant, j'ai de plus en plus tendance à :
Car il est toujours plus simple d'écrire mais surtout de maintenir :
read_dir('toto');quefor($list = array(), $dir = opendir('toto'); $list[] = readdir($dir););, enfin AMHANote : Ceci n'est pas un troll
NiKo > Je suis tout à fait dans cette optique là lorsque je code. Toujours penser à la maintenance du code, c'est pas un exercice facile mais AMHA c'est indispensable. J'ai eu la chance de travailler avec un gourou PHP pendant un an qui malheureusement pour moi codait avec des raccourcis impressionants et le tout sans une ligne de commentaires, pour comprendre ce qu'il voulait faire j'y passais des heures. Ceci dit j'ai appris des tonnes de trucs grâce à lui
Faut pas croire que je favorise les onliners, hein, c'était juste une blague !
Je suis aussi à fond pour la lisibilité du code, histoire de laisser les autres débugguer ce que je fais...
Tiens, au passage, les Gravatars ne marchent plus car gravatar.com ne répond plus, il faut essayer avec 64.124.231.223/ ...
Nicolas Hoizey > No problemo
Pour gravatar, vu les problèmes qu'ils semblent rencontrer je vais attendre avant d'utiliser l'IP fixe. En tout cas c'est etonnant, cette longue indisponibilité du serveur...
Ce que j'utilise pour parcourir mes répertoires à la recherche d'images
www.mega-box.net/index.ph...
Qui a dit que mon code est trop commenté ^^
et ben je suis bien contente que nos profs de l'IUT nous aient pris la tête avec l'indentation, les commentaires et tout ça... ce sont des habitudes (voire manies extrémistes :D) que je garde et dont je ne peux pas me passer... et en effet, quand il m'arrive de devoir replonger dans mon code, je suis bien contente d'y avoir fait attention !

Mathieu : au moins ça te permet de le diffuser sans qu'on vienne te demander des détails et explications, finalement en un sens tu t'économises du boulot