2007
Exploration récursive de répertoires
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 / >'."\r\n";
$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 / >'."\r\n";
}
}
}
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;
}