« »
4/20/2008

Lire récursivement un répertoire en php

Si vous n'avez jamais réussi à parcourir un répertoire ainsi que tout ses sous répertoire en php, ce message est pour vous !

Mais tout d'abord, un petit rappel, qu'est-ce qu'une fonction récursive ?
Une fonction récursive est une fonction qui peut s'appeler elle-même au cours de son exécution
(Wikipedia)
L'algorithme est donc court :

Fonction parcourir(rep)
E :
chaine : rep /* le répertoire à lire */
S :
chaine : liste_fichier /* liste des fichiers dans ce répertoire */
Var :
chaine : f /* fichier actuel */

Debut

TantQue(f = lire_repertoire(rep)))
Si est_repertoire(f)
Alors
liste_fichier += parcourir(rep + f)
FinSi

Si est_fichier(f)
Alors
liste_fichier += f
FinSi
FinTantQue

retourne liste_fichier
Fin


En bref, notre fonction lit le contenu d'un répertoire et retourne sous forme de chaine la liste des nom de fichier qui compose le répertoire en cours (à savoir "rep"). A chaque sous répertoire découvert, on ré-appelle la fonction "parcourir" avec l'adresse actuelle du répertoire ainsi que le nom du sous répertoire, ce qui nous retournera une liste de fichier composant ce répertoire.

Ainsi on va alors obtenir un enchainement d'appelle de fonction "parcourir" chaque fonction retournant une chaine "liste_fichier" à son appelant qui lui même retournera à son appellant etc... Jusqu'à ce que la première fonction appelante, qui aura récupérée tout les "liste_fichier" retourne elle même cette valeur.

Voici donc un exemple de code, qui permet de parcourir tous les sous répertoires d'un dossier, et de calculer le nombre de ligne de code de chaque fichier php, htm/html, css et javascript qu'il contient.
<style>
quote {padding:5px;padding-left:20px;display:block;}
</style>
<?php
function compte_ligne_code($f)
{
    return count(file($f));
}

function read_dir($dir,$dir_max)
{
    $array = array(2);
    if(!strrchr($dir, '_NO_'))//dossier vide
    {
    $me = 0;
    $hdl = @opendir($dir);
    while($f = @readdir($hdl))
    {
        if(is_dir($dir.'/'.$f) && $f !== '..' && $f !== '.')
        {
            if($dir_max > 0)
            {
            $dir_max--;
            $array[0] .= '<quote style="background:#'.rand(2,9).'f'.rand(2,9).'f'.rand(2,9).'f">[DIR] <h3>'.$dir.'/'.$f.'</h3><br />';
                $narray = read_dir($dir.'/'.$f,$dir_max);
                $array[0] .= $narray[0];//code html
                $array[1] += $narray[1];//nombre de ligne
            $array[0] .= '</quote>
';
            }
        }
        else if((substr($f, -4, 4) == '.php'
        ||    substr($f, -3, 3) == '.js'
        ||    substr($f, -4, 4) == '.css'
        ||    substr($f, -4, 4) == '.htm'
        ||    substr($f, -5, 5) == '.html'
        )  && substr($f, 0, 4) !== '_NO_')//fichier .php ou .js
        {
            $l = count(file($dir.'/'.$f));
            $array[1] += $l;
            $array[0] .= '<quote style="background:#'.rand(2,9).'f'.rand(2,9).'0'.rand(2,9).'f">'.$l.' ligne(s) dans <strong style="float:right">'.$dir.'/'.$f.'</strong>';
            $array[0] .= '</quote>
';
        }
        else
        {
        $array[0] .= '['.$dir.'/'.$f.'] ';
        }
    }
    }
    else
    {
        $array[0] .= '<quote style="background:#000000;color:#ffffff">Passe le dossier dossier : '.$dir.'</quote>';
    }
    return $array;
}

$arr = read_dir('.',100);
echo '<h1>'.$arr[1].' lignes de code !</h1>'.$arr[0];


Si vous souhaitez que des dossiers ou des fichiers ne soient pas pris en compte ajoutez "_NO_" devant, par exemple "images" devient "_NO_images" et ainsi de suite.
« »
 
 
Made with on a hot august night.
http://bit.ly/1II1u5L