Salut et merci de prendre la peine de lire tout ce qui suit, c'est un peu long mais très simple.
A la base je voulais créer une version récursive de la fonction glob, pour pouvoir lister des sous-dossiers.
Voici donc le contexte exact de ma tentative infructueuse de codage récursif :
- Premièrement, j'ai crée un dossier pour mes tests : "c:/test".
Dans ce dossier, il y a 3 fichiers texte et 2 sous-dossiers "A" et "B"
contenant à leur tour resp. deux et un fichiers texte.
Voici donc le contenu de "c:/test" (2 dossiers, 6 fichiers) :
- c:/test/A/a_01.txt
- c:/test/A/a_02.txt
- c:/test/B/b_01.txt
- c:/test/x_03.txt
- c:/test/x_01.txt
- c:/test/x_02.txt
Et voici le code de la fonction glob_s dont l'unique paramètre contient
le nom du dossier dont il faut lister le contenu.
Et voici le résultat de l'exécution (tronqué, mais l'essentiel tient en quatre lignes) :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 $count = 0; print glob_s("c:/test"); sub glob_s { #Sans la ligne ci-dessous, il y aurait une boucle infinie ! if($count++ > 100){return "";} my($path) = $_[0]; my($ret_list) = "\nglob_s CALL #".$count." path = \"".$path."\"\n"; while(glob($path)){ my($file) = $_; if(-f $file){ $ret_list .= "#".$count."{".$path."}"." found file \"".$file."\"\n";} elsif(-d $file){ $ret_list .= "#".$count."{".$path."}"." found dir \"".$file."\"...\n".glob_s($file."/*");} } return $ret_list; }#glob_s
glob_s CALL #1 path = "c:/test"
#1{c:/test} found dir "c:/test"...
glob_s CALL #2 path = "c:/test/*"
#2{c:/test} found dir "c:/test"...
... etc ... (jusqu'à #101)
Il y a un problème flagrant lors du 2ème appel (#2) de glob_s avec la valeur de la variable $path
qui fait que le texte en vert ne correspond pas au texte en rouge, d'où la boucle infinie.
Pourquoi diable $path ne garde pas la même valeur à l'intérieur se glob_s ???
Partager