Voici donc un code PHP permettant de parcourir une arborescence de dossiers et fichiers en une seule fois, d’où son nom « Exploration récursive de répertoires »
Le code en lui-même n’a rien d’exceptionnel, il existe déjà depuis bien des années.
Je voulais juste (pour ceux qui ne connaissent pas cette fonction) mettre en lumière la fonction « scandir » de PHP.
Cette fonction liste l’intégralité du répertoire qui lui est passé en paramètre.
Elle a d’autres atouts comme la possibilité de scanner un répertoire sur un serveur distant en utilisant un protocole ftp ou même ftps.
Scandir dans toute sa splendeur:
array scandir ( string $directory [, int $sorting_order [, resource $context]] )
directory
Le dossier qui sera scanné.
sorting_order
Par défaut, le tri est en ordre alphabétique. Si le paramètre optionnel sorting_order est utilisé (mis à 1), alors le tri sera en ordre alphabétique inverse.
context
Pour une description du paramètre context, référez-vous à ce lien : http://fr2.php.net/manual/fr/ref.stream.php
(information issue de la doc de php)
Pour en savoir plus sur cette fonction je vous recommande ce lien: http://fr2.php.net/manual/fr/function.scandir.php
Pour ce bout de code on utilisera aussi cette fonction « realpath » qui a pour tâche de nous retourner le chemin canonique du chemin passé en paramètre.
Pour en savoir plus sur cette fonction c’est par là : http://fr2.php.net/manual/fr/function.realpath.php.
Donc voici le code, qui va aller chercher les dossiers et fichiers de manière récursive, c’est à dire qu’il va scanner l’intégralité du répertoire que vous lui passez en paramètre.
Trêve de bavardage le voici !
$arborescence = scanRecursif($baseDir);
echo $arborescence;
function scanRecursif($rep, $depth=0) {
$depth++; // définit la profondeur du dossier et des fichier
$spaceDepth = makeSpace($depth); // va créer une chaîne composée de ce qui va permettre une légère indentation
$dir = scandir($rep);
if($dir) {
// on traite chaque élément retourné par la fonction php scandir
foreach($dir as $f) {
// on vérifit la présence de sous répertoires, par contre on ne prend pas en compte les répertoires précédents "./" et "../"
if( is_dir($rep.$f) && $f!=".." && $f!="." ) {
$fileList.= $spaceDepth.'< span style="color:red; font-weight:bold;" >'.$f.'< /span >< br / >'."
";
$new_dir=realpath($rep.$f); //chemin absolu du répertoire enfant
// On réitère la fonction pour aller scanner les sous répertoires.
$fileList .= scanRecursif("$new_dir/",$depth);
}
// ce traitement est effectué si la variable $f est un fichier
if(is_file($rep.$f)) {
$fileList .= $spaceDepth.' < span >|_'.$f.'< /span >< br / >'."
";
}
}
}
return $fileList;
}
//fonction retournant une suite d'espaces pour légèrement indenter le code de sortie
function makeSpace($depth) {
$out = '';
for($x=0; $x<=$depth; $x++) {
$out .= " ";
}
return $out;
}