Lister le contenu d’un dossier
Il arrive souvent qu’on stocke certaines données dans des fichiers sur le serveur, il faut pouvoir les récupérer pour les lire.
Pour lister un dossier et ces fichiers, il y a plusieurs façon comme utiliser opendir avec readdir ou simplement la fonction scandir.
La seconde étant la plus simple.
- Lister le contenu d’un dossier avec opendir et readdir
- Lister le contenu d’un dossier avec scandir
- Lister le contenu d’un dossier et de ces sous dossier avec opendir et readdir
- Lister le contenu d’un dossier et de ces sous dossier avec scandir
ICI on liste le contenu d’un dossier avec opendir et readdir:
<?php $dir = "./"; if ($dh = opendir($dir)) { while (($file = readdir($dh)) !== false) { if($file != '.' && $file != '..') // On affiche pas . et .. { echo $file."<br>\n"; } } closedir($dh); // on ferme la connection } ?>
C’est bien compliqué pour pas grand chose et il faut écrire beaucoup^^.
Voila ce qu’on obtient avec scandir:
<?php $scandir = scandir("./"); foreach ($scandir as $key => $value) { if(($value !== ".") AND ($value !== "..")) // On affiche pas . et .. { echo $value."<br>\n"; } } ?>
Comment aller plus loin ? Cette fonction va lister le contenu d’un dossier et de ces sous dossier avec opendir et readdir:
<?php function listage_fichier($path) { //On déclare le tableau qui contiendra tous les éléments de nos dossiers $tableau_elements = array(); //On ouvre le dossier $dir = opendir($path); //Pour chaque élément du dossier... while (($element_dossier = readdir($dir)) !== FALSE) { //Si l'élément est lui-même un dossier (en excluant les dossiers parent et actuel), on appelle la fonction de listage en modifiant la racine du dossier à ouvrir if ($element_dossier != '.' && $element_dossier != '..' && is_dir($path.'/'.$element_dossier)) { //On fusionne ici le tableau grâce à la fonction array_merge. Au final, tous les résultats de nos appels récursifs à la fonction listage fusionneront dans le même tableau $tableau_elements = array_merge($tableau_elements, listage_fichier($path.'/'.$element_dossier)); } elseif ($element_dossier != '.' && $element_dossier != '..') { //Sinon, l'élément est un fichier : on l'enregistre dans le tableau $tableau_elements[] = $path.'/'.$element_dossier; } } //On ferme le dossier closedir($dir); //On retourne le tableau return $tableau_elements; } //On définit la racine $path = '/var/www/dossier_test'; // simonbhb.fr/blog/ //Appel de notre fonction $tableau_elements = listage_fichier($path); // On classe par ordre croissant asort($tableau_elements); echo count($tableau_elements)." fichiers:<br>"; // On liste les fichiers avec une boucles: foreach ($tableau_elements as $key => $value) { echo $value.'<br>'; } ?>
Un autre exemple de la même fonction, mais avec scandir:
<?php function listage_fichier($path) { //On déclare le tableau qui contiendra tous les éléments de nos dossiers $tableau_elements = array(); //On ouvre le dossier $dir = scandir($path); //Pour chaque élément du dossier... foreach ($dir as $key => $element_dossier) { //Si l'élément est lui-même un dossier (en excluant les dossiers parent et actuel), on appelle la fonction de listage en modifiant la racine du dossier à ouvrir if ($element_dossier != '.' && $element_dossier != '..' && is_dir($path.'/'.$element_dossier)) { //On fusionne ici le tableau grâce à la fonction array_merge. Au final, tous les résultats de nos appels récursifs à la fonction listage fusionneront dans le même tableau $tableau_elements = array_merge($tableau_elements, listage_fichier($path.'/'.$element_dossier)); } elseif ($element_dossier != '.' && $element_dossier != '..') { //Sinon, l'élément est un fichier : on l'enregistre dans le tableau $tableau_elements[] = $path.'/'.$element_dossier; } } //On retourne le tableau return $tableau_elements; } //On définit la racine $path = '/var/www/dossier_test'; //Appel de notre fonction $tableau_elements = listage_fichier($path); echo count($tableau_elements)." fichiers afiché:<br>"; // On liste les fichiers avec une boucles: foreach ($tableau_elements as $key => $value) { echo $value.'<br>'; } ?>
Tous les codes sont testés et sont fonctionnels, si il arrive qu'un de ces codes ne fonctionne pas chez vous, merci de me le signaler.