Besoin d'aide pour un script. [Résolu]

Messages postés
2
Date d'inscription
jeudi 12 janvier 2006
Statut
Membre
Dernière intervention
30 août 2010
- - Dernière réponse : TychoBrahe
Messages postés
1310
Date d'inscription
samedi 31 janvier 2009
Statut
Membre
Dernière intervention
5 juin 2013
- 30 août 2010 à 17:10
Bonjour à tous,

Je cherche à réaliser un script qui liste tous les dossiers et sous-dossiers d'un disque de manière récursive et surtout de stocker chaque entrée dans une variable "array". Voici le code que j'utilise pour le moment.
//Liste les dossiers de maniere récursive
function liste_rep($src_dir, $tabl_dir=array()) {
    $dir = opendir($src_dir);
    while($nom = readdir($dir)) {
if ($nom != "." && $nom != "..") {
    $chemin=$src_dir ."/". $nom;
    if (is_dir($chemin)) {
        echo $chemin."
";
array_push($tabl_dir, $chemin);
liste_rep($chemin);
    }
}
    }
    closedir($dir);
    return $tabl_dir;
}

define("ROOT", "F:/Web/");

$List_Dir = liste_rep(ROOT);


Il fonctionne bien. la line "echo $chemin."
";" me retourne ce que je souhaite stocker, à savoir :
........
F:/Web//Developpement
F:/Web//Developpement/Ajax
F:/Web//Developpement/Ajax/dossierTest
F:/Web//Developpement/Ajax/dossierTest/case
F:/Web//Developpement/Ajax/dossierTest/Documents
F:/Web//Developpement/Ajax/dossierTest/Documents/CV & Lettres de motivation
F:/Web//Developpement/Ajax/dossierTest/Documents/Projets Entreprise
F:/Web//Developpement/Ajax/dossierTest/Documents/Recettes Cuisine
F:/Web//Developpement/Ajax/dossierTest/Documents/Recettes Cuisine/Pizzas
F:/Web//Developpement/Ajax/dossierTest/Documents/Recettes Cuisine/Soupes & Veloutés
F:/Web//Developpement/Ajax/dossierTest/Images
F:/Web//Developpement/Ajax/dossierTest/Musiques
F:/Web//Developpement/Ajax/dossierTest/Paquets
F:/Web//Developpement/Ajax/dossierTest/Vidéos
F:/Web//Developpement/Ajax/images
......


Le problème, c'est que ma array ne contient que le premier niveau de dossiers...
F:/Web//00-temp
F:/Web//Administratif
F:/Web//Developpement
F:/Web//Intranet
F:/Web//Modeles UML
F:/Web//Photos_collaborateurs
F:/Web//serveur
F:/Web//serveur_test
F:/Web//SiteWeb_MC
F:/Web//SiteWeb_MC_Archives
F:/Web//test
F:/Web//ToolBox
F:/Web//www

Et je souhaiterais avec toutes les entrées dans mon array.

La finalité de ce code serait de stocker dans une BDD le chemin, nom du fichier, extension, taille et dernière modif, afin de créer un petit moteur de recherche pour nos archives.

Si vous avez une bonne idée, je suis preneur. :)
Afficher la suite 

7 réponses

Meilleure réponse
Messages postés
1310
Date d'inscription
samedi 31 janvier 2009
Statut
Membre
Dernière intervention
5 juin 2013
10
3
Merci
Salut,

Une solution est de faire retourner à ta fonction un tableau contenant tout ce qu'elle à listé, ainsi avec un simple array_merge() on peut récupérer le résultat des appels récursifs. Voici un exemple d'implémentation sur lequel j'ai changé 2 ou 3 trucs (y compris le style) :

<?php

function liste_rep($src_dir, $tabl_dir=array())
{
  if (substr($src_dir, -1) != '/')
    $src_dir .= '/';
  $dir = scandir($src_dir);
  if ($dir === false)
    return array();
  $list = array();
  foreach($dir as $fileName)
    {
      if ($fileName[0] != '.')
        {
          $filePath = $src_dir . $fileName;
          echo $filePath, '
';
          if (is_dir($filePath))
            $list = array_merge($list, liste_rep($filePath));
          else
            $list[] = $filePath;
        }
    }
  return $list;
}

define('ROOT', 'F:/Web/');
var_dump(liste_rep(ROOT));

?>

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 195 internautes nous ont dit merci ce mois-ci

Commenter la réponse de TychoBrahe
Messages postés
70
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
17 mai 2019
2
0
Merci
il faut a mon avis passer le tableau en tant que paramètre par référence

function liste_rep($src_dir, &$tabl_dir) {
....
Commenter la réponse de Raul duke
Messages postés
1310
Date d'inscription
samedi 31 janvier 2009
Statut
Membre
Dernière intervention
5 juin 2013
10
0
Merci
Oops, au fait dans le code que j'ai posté on peu carrément virer $tabl_dir des paramètres, il est tellement useless que je ne n'y avais pas fait attention. J'en profite pour dénoncer cette technique de passer le paramètre par référence : négliger le retour normal d'une fonction au profit d'un effet de bord est une mauvaise pratique qui conduit bien souvent à de jolis bugs.
Commenter la réponse de TychoBrahe
Messages postés
70
Date d'inscription
vendredi 16 décembre 2005
Statut
Membre
Dernière intervention
17 mai 2019
2
0
Merci
<html><head><title></title>
<?php 
//Liste les dossiers de maniere récursive
function liste_rep($src_dir, &$tabl_dir) 
{
    $dir = opendir($src_dir);
    while($nom = readdir($dir)) 
{
if ($nom != "." && $nom != "..") 
{
    $chemin=$src_dir ."\". $nom;
    if (is_dir($chemin)) 
{	
        echo $chemin."
";
array_push($tabl_dir,$chemin);
liste_rep($chemin,$tabl_dir);
    }
}
    }
    closedir($dir);
}
?>

</head>

<?php
define("ROOT", "D:\wamp");
$List_Dir= array();
liste_rep(ROOT, $List_Dir); 

echo "
TABLEAU
";
foreach ($List_Dir as $ent)
{
echo $ent, " ";
}
?>
</html>
Commenter la réponse de Raul duke
Messages postés
197
Date d'inscription
mardi 20 janvier 2004
Statut
Membre
Dernière intervention
20 février 2013
1
0
Merci
Bonjour,

où en utilisant la SPL:

<?php
$sPath = 'c:/temp/';

$oIter = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator(
        $sPath,
RecursiveDirectoryIterator::KEY_AS_FILENAME
    ),
    RecursiveIteratorIterator::SELF_FIRST
);

$aRes = array();

foreach($oIter as $oData) {
    if ($oData->isDir()) {
        $aRes[] = $oData;
    }
}


bonne journée
Commenter la réponse de cs_47
Messages postés
2
Date d'inscription
jeudi 12 janvier 2006
Statut
Membre
Dernière intervention
30 août 2010
0
Merci
@TychoBrahe
Merci, en modifiant un tout petit peu ton code, je suis arrivé à mes fins. Par contre je vais devoir travailler mon PHP encore et encore, j'ai pas compris tout de suite ton code. l'abscnce { m'a un peu déstabilisé. Au début j'ai cru à une simplification pour par tout écrire sur le forum, mais quand j'en ai rajouté... ça marchait plus :)

@Tous les autres
Merci beaucoup d'avoir pris le temps de répondre. Juste une question @47 : SPL:, qu'est-ce que c'est???

Dsl, débutant inside :)
Commenter la réponse de Yodelei
Messages postés
1310
Date d'inscription
samedi 31 janvier 2009
Statut
Membre
Dernière intervention
5 juin 2013
10
0
Merci
l'abscnce { m'a un peu déstabilisé

Les accolades ne servent qu'à délimiter un bloc d'instructions, dans la cas où il n'y a qu'une seule instruction il n'est donc pas nécessaire de les mettre. Exemple des deux versions équivalentes :
<?php
if (true)
   echo 'toto';
if (true)
   {
      echo 'toto';
   }
?>


SPL:, qu'est-ce que c'est???

Tout est expliqué dans la doc PHP ;)
Commenter la réponse de TychoBrahe