Lister tous les fichiers d'un dossier et ses sous-dossiers en PHP

Mars 2013

En PHP, il est possible de parcourir le contenu d'un répertoire (aussi appelé dossier ou directory) en listant les fichiers et les dossiers qu'il contient.

Ici, nous allons voir comment effectuer ce parcours de manière récursive, c'est à dire en analysant le contenu de chaque sous-dossier.

Qu'est-ce qu'une fonction récursive ?

Une fonction récursive est une fonction qui s'appelle elle même. Ce type de programmation est en général un peu plus difficile à appréhender que la programmation procédurale, le principal piège à éviter est la boucle infinie.

Toute fonction récursive doit obligatoirement comporter une condition d'arrêt, faute de quoi la fonction ne va cesser de s'appeler elle même indéfiniment et ainsi entrer dans une boucle sans fin.

Pour l'exemple, on va créer un script qui va lister tous les fichiers et les dossiers contenus dans le répertoire courant (celui dans lequel se trouve le script), ainsi que la date de modification et le poids de chaque fichier :

<?php
function explorer($chemin){
	$lstat    = lstat($chemin);
	$mtime    = date('d/m/Y H:i:s', $lstat['mtime']);
	$filetype = filetype($chemin);
	
	// Affichage des infos sur le fichier $chemin
	echo "$chemin	type: $filetype	size: $lstat[size]	mtime: $mtime\n";
	
	// Si $chemin est un dossier => on appelle la fonction explorer() pour chaque élément (fichier ou dossier) du dossier$chemin
	if( is_dir($chemin) ){
		$me = opendir($chemin);
		while( $child = readdir($me) ){
			if( $child != '.' && $child != '..' ){
				explorer( $chemin.DIRECTORY_SEPARATOR.$child );
			}
		}
	}
}

header('Content-type: text/plain');
explorer(dirname(__FILE__));
?>

Dans la fonction explorer, la condition d'arrêt est le type de l'élément. La fonction n'est appelée récursivement que si l'élément est un dossier, et étant donné qu'il ne peut pas y avoir une infinité de dossiers imbriqués, la fonction ne bouclera pas à l'infinie.

Cet algorithme peut aussi être utilisé pour créer une version récursive de la fonction glob() (cette fonction sert à récupérer la liste des fichiers dont le nom vérifie le pattern passé en paramètre, permettant par exemple de filtrer les fichiers sur leur extension).

Après avoir lu presse papier vide (copier-coller) dans excel vous en saurez d'avantage sur ce sujet.

PHP 5's RecursiveDirectoryIterator

PHP 5 offre de nouvelles fonctionnalités très utiles qui permettent de faire la même chose (parcourir une arborescence sur le système de fichier), grâce aux classes RecursiveDirectoryIterator et RecursiveIteratorIterator :

<?php
header('Content-type: text/plain');

$dir_iterator = new RecursiveDirectoryIterator(dirname(__FILE__));
$iterator = new RecursiveIteratorIterator($dir_iterator);
foreach ($iterator as $file) {
    echo $file."\n";
}
?>

On peut même utiliser un pattern pour matcher seulement certains fichiers en fonction de leur nom, en utilisant la classe RegexIterator.

Si vous n'êtes pas contraint à utiliser PHP 4, je vous recommande cette seconde méthode, elle est beaucoup plus propre et facile à maintenir que la récursivité.

Encore faim ? allez lire ça : retoucher un visage !

2 commentaires :
commentaire n°2664 par Guillaume
Guillaume mercredi 16 octobre 2013, 09:17
Merci, très pratique la seconde solution !
commentaire n°3453 par f4b1
f4b1 samedi 4 février 2017, 11:12
Merci pour cette astuce, je suis vraiment fan de la seconde solution aussi !
facultatif
Facebook Twitter RSS Email
Forum Excel
Venez découvrir le nouveau forum excel question/réponse à la stackoverflow.com !
Forum Excel
hit parade n'en a rien a foutre du W3C Positionnement et Statistiques Gratuites Vincent Paré