PARCOURS RECURSIF D'UN REPERTOIRE

coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 - 3 mai 2005 à 23:01
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 - 9 sept. 2005 à 11:23
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/31179-parcours-recursif-d-un-repertoire

malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
9 sept. 2005 à 11:23
Ok, celui-ci est pour la fonction de base, je vais effacer le reste puisque l'explorateur complet, je l'ai mis dans une autre source.
Tu copies ceci dans ton fichier :
# // fonction de base
#
# <?php
# function recursive_readdir ($dir) {
# $dir = rtrim ($dir, '/'); // on vire un eventuel slash mis par l'utilisateur de la fonction a droite du repertoire
# if (is_dir ($dir)) // si c'est un repertoire
# $dh = opendir ($dir); // on l'ouvre
# else {
# echo $dir, ' n\'est pas un repertoire valide'; // sinon on sort! Appel de fonction non valide
# exit;
# }
# while (($file = readdir ($dh)) !== false ) { //boucle pour parcourir le repertoire
# if ($file !== '.' && $file !== '..') { // no comment
# $path =$dir.'/'.$file; // construction d'un joli chemin...
# if (is_dir ($path)) { //si on tombe sur un sous-repertoire
# echo '', $path, ' -> dir

'; // ptit style...
# echo '
'; // idem...
# recursive_readdir ($path); // appel recursif pour lire a l'interieur de ce sous-repertoire
# echo '

';
# }
# else
# echo $path, '
'; // si il s'agit d'un fichier, on affiche, tout simplement.
# }
# }
# closedir ($dh); // on ferme le repertoire courant
# }
# ?>

Pour l'appeler, il suffit de faire :
recursive_readdir (nom du répertoire ou sous-répertoire à lister);
Par exemple :

recursive_readdir ('.');
=> va lister le répertoire courant.
recursive_readdir ('datas');
=> va lister le sous-répertoire datas
JIUZ Messages postés 1 Date d'inscription mercredi 22 décembre 2004 Statut Membre Dernière intervention 9 septembre 2005
9 sept. 2005 à 10:02
Bonjour
Je suis nouveau et je voudrais savoir comment on installe ce script

J'ai une page blanche à l'exécution.

Merci de votre aide
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
18 mai 2005 à 14:17
Tssssssssssss

;-)

Tien j'update...
fuckya Messages postés 125 Date d'inscription mercredi 31 mars 2004 Statut Membre Dernière intervention 8 juin 2006
18 mai 2005 à 14:14
Bah par CSS j'entendais un truc super joli quoi :)
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
18 mai 2005 à 09:04
Merci :-)

J'ai pas tout mis avec du css ? lol, ah merde...j'ai essaye ;-)
En fait j'ai un soucis d'ergonomie...j'ai du mal a voir quelle est la meilleure facon
d'agencer tout ca. Parce que je veux les fonctions basiques d'un explorateur, mais aussi
quelques autres trucs, qui impliquent la selection de plusieurs fichiers ou/et repertoires.
Je crois que je vais devoir me rabattre sur des checkboxes meme si l'idee ne me seduit
pas :-( Si t'as une idee...
fuckya Messages postés 125 Date d'inscription mercredi 31 mars 2004 Statut Membre Dernière intervention 8 juin 2006
17 mai 2005 à 18:29
Tiens d'ailleurs ton projet est très intéressant et je vais voir si je peux améliorer quelques trucs et mettre du css
fuckya Messages postés 125 Date d'inscription mercredi 31 mars 2004 Statut Membre Dernière intervention 8 juin 2006
17 mai 2005 à 18:25
Bah tu sais ca me fais très plaisir ^_^ J'ai hâte de voir le résultat :)
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
17 mai 2005 à 18:24
Heu d'ailleurs...toi, Fuckya...il est fort possible que je finisse par utiliser au moins une partie,
ou des idees, de ta classe formulaire :-) Parce que bon...autant ne pas refaire un bon boulot deja fait!
Si t'es d'accord, evidemment, c#est pour ca que je t'en parle (pour cet explorateur en fait).
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
17 mai 2005 à 18:22
Lol ah oui ?
Bah telecharge, y a le zip (sans la fonction de base, mais y a toute la classe. Si il y a ce probleme,
demain je rajouterai dans le zip la fonction de base, au moins...)

Bonne soiree, je me rentre a la maison mouah :-)
fuckya Messages postés 125 Date d'inscription mercredi 31 mars 2004 Statut Membre Dernière intervention 8 juin 2006
17 mai 2005 à 18:19
Super, impossible de sélectionner le code sur phpcs maintenant, on se retrouve avec les numéros des lignes !
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
17 mai 2005 à 17:40
Pour ceux que ca interesse, j'ai fait un ajout a cette source :
une classe (en fait 3) PHP5 se voulant le debut d'un explorateur de fichiers.
Pour l'instant, pas grandchose, a part que c'est mimi tout plein ;-) que ca affiche
les repertoires et les fichiers dans deux panneaux differents (comme un explorateur, quoi),
des vignettes html d'images eventuellement presentes dans un repertoire, et quelques infos.
C'est tout pour le moment, mais en ce moment j'ai du temps alors je pense finir ce truc pour
en faire un veritable explorateur avec des fonctionnalites dignes de ce nom.
Voili.
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
9 mai 2005 à 06:39
Ah, merci GRenard de venir a ma rescousse ;-)
cs_GRenard Messages postés 1662 Date d'inscription lundi 16 septembre 2002 Statut Membre Dernière intervention 30 juillet 2008 1
8 mai 2005 à 15:32
Check php.net :
/* Ceci est la façon correcte de traverser un dossier. */
while (false !($file readdir($handle))) {
echo "$file\n";
}

/* Ceci est la MAUVAISE façon de traverser un dossier. */
while ($file = readdir($handle)) {
echo "$file\n";
}

Messemble que c'est clair ?
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
4 mai 2005 à 17:31
Bon '1' n'est pas un bon exemple lol...'0' uniquement.
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
4 mai 2005 à 17:29
Bon j'explique lol :

si un repertoire a pour nom '1' ou '0'...vous faites quoi ?
Ou 'false'...ca doit marcher aussi avec php.

D'ailleurs, je viens de relire la doc :

Please note the fashion in which readdir()'s return value is checked in the examples below. We are explicitly testing whether the return value is identical to (equal to and of the same type as--see Comparison Operators for more information) FALSE since otherwise, any directory entry whose name evaluates to FALSE will stop the loop (e.g. a directory named "0").

Voila pourquoi je prefere cette version.
fuckya Messages postés 125 Date d'inscription mercredi 31 mars 2004 Statut Membre Dernière intervention 8 juin 2006
4 mai 2005 à 17:22
readdir renvoie toujours true ou false ? Si oui moi perso j'aurais mis comme coucou
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
4 mai 2005 à 16:35
Donc, je ne suis pas d'accord pour le while (), lol.
Question de clarte, et d'eviter topute erreur possible...

Pour le $path, exact, oubli de ma part en relisant le code :-)
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
4 mai 2005 à 16:08
while (($file = readdir ($dh)) !== FALSE ) {
$path =$dir;
if ($file !== '.' && $file !== '..') {
$path .='/'.$file;

en optimisé :

while ($file = readdir ($dh) ) {
if ($file !== '.' && $file !== '..') {
$path =$dir.'/'.$file;
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
4 mai 2005 à 13:52
Je suis d'accord, mais bon c'est le pc de ma boite et je bosse avec lol, je ne voudrais pas qu'il soit indisponible trop longtemps. Ca se remarquerait ;-)
fuckya Messages postés 125 Date d'inscription mercredi 31 mars 2004 Statut Membre Dernière intervention 8 juin 2006
4 mai 2005 à 13:49
Il faut faire plus de 100 itérations pour avoir un résultat valable ^_^

100 000 au moins, je fais 1 000 000 pour les trucs assez courts
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
4 mai 2005 à 13:31
J'ai mis les simples quotes, comme je le disais, c'etait un oubli de ma part, je les mets toujours normalement lol.
Bah apparemment c'est plus rapide, mais bon...il faudrait des tests plus pousses.

Je suis aussi au boulot lol...
cs_twisteurwin Messages postés 167 Date d'inscription mardi 21 septembre 2004 Statut Membre Dernière intervention 2 mai 2009
4 mai 2005 à 13:28
malalam je suis déjà au boulot mdrr
J'ai la chance d'avoir une connection internet :-)
concernant les résultats
- mon if () : 1.87087702751
Tu tiens compte des simples ou doubles quotes ?
Si c'est ton code optimisé qui est le + rapide alors ne change rien...maintenant Fuckya's et moi on ne fait qu'essayer de le rendre optimisé différement...
Les 3 codes sont valides à toi de choisir le meilleur car c'est ton code... :-)
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
4 mai 2005 à 13:07
Oups c'est vrai que tu avais une classe bench....desole, j'ai fait ca en direct avec un bench ecrit pour l'occasion lol.
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
4 mai 2005 à 13:06
=> Twisteur : tu ne devais pas aller bosser au fait... ? ;-)

=> Fuckya : On va voir! Apres tout...autant tester :-)

Ok : 100 iterations sur mon code.
- mon if () : 1.87087702751
- Fuckya's if () : 1.95857787132
- Twisteur's if () : 1.88548898697

J'ai gagne, mais de tres peu... ;-) En tous cas sur la vitesse, apres...question reelle optimisation (efficacite...), ca reste a prouver.
fuckya Messages postés 125 Date d'inscription mercredi 31 mars 2004 Statut Membre Dernière intervention 8 juin 2006
4 mai 2005 à 13:05
Vous pouvez essayer vos tests de rapidité avec ma classe bench aussi :D
fuckya Messages postés 125 Date d'inscription mercredi 31 mars 2004 Statut Membre Dernière intervention 8 juin 2006
4 mai 2005 à 12:48
Vérifier la valeur de $file 3 fois, ou vérifier une valeur dans un tableau, je sais pas lequel est le plus rapide ^^
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
4 mai 2005 à 12:48
On attendra d'autres avis alors :-)
Parce que EasyPHP, question optimisation...lol.
Ceci dit oui, je ne dis pas que tu as tort, mais je veux une explication. On verra ce qu'en disent d'eventuels autres commentaires :-)
cs_twisteurwin Messages postés 167 Date d'inscription mardi 21 septembre 2004 Statut Membre Dernière intervention 2 mai 2009
4 mai 2005 à 12:38
malalam, j'ai une réponse pour toi, je sais ou j'ai trouvé l'exemple ! :-)
Il s'agit de "index.php" par défaut qui se trouve dans easyphp1.7 dans le repertoire "www"...
Donc je n'ai rien inventé...
J'ai pris exemple la dessus.
Après qu'est ce qui est mieux... je ne suis pas expert mais Coucou parlait d'optimisation ...
J'ai essayé, à toi de voir ce qui est plus judicieux et de mieux pour ton code...
Je pense que Coucou, Antho ou Grenard ont surrement de meilleurs arguments que moi...
Il fonctionne et c'est déjà pas mal :-)
+++
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
4 mai 2005 à 12:38
Heu...
quelqu'un sait comment forcer Firefox a afficher des line break...?
J'ai essaye l'entite mais ca ne fonctionne pas non plus :-(
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
4 mai 2005 à 11:13
Le standard (la doc), c'est ca :

<?php
if ($handle = opendir('.')) {
while (false !($file readdir($handle))) {
if ($file != "." && $file != "..") {
echo "$file\n";
}
}
closedir($handle);
}
?>

http://de.php.net/readdir

Et un fichier sans nom, sans extension...si il y en a un sur mon pc, j'aimerais assez le savoir quand meme parce que ce serait louche!
En tous cas je vais m'amuser a modifier cette source, un peu, et lui ajouter des fonctionnalites je crois.

=> Fuckya : lol, je ne sais pas non plus...mais c'est original en tous cas! Ceci dit je ne pense pas que ce soit plus rapide de parcourir un tableau de deux chaines (ou 3) avec in_array() que de comparer avec 2 (ou 3) chaines.
Mais c'est original! :-)
cs_twisteurwin Messages postés 167 Date d'inscription mardi 21 septembre 2004 Statut Membre Dernière intervention 2 mai 2009
4 mai 2005 à 11:01
regarde
fuckya> if(!in_array($file, array('.', '..', '')))
il le met aussi !
Ben moi je le passe aussi en parametre car c'est le standard ! si la valeur est nule il la traite et la passe aussi dans la condition...
Bon jvais aller bosser je reviens voir ce post ce soir
+++
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
4 mai 2005 à 10:52
Ben pourauoi le $file!='' est important ? Je n'y suis pas la lol, explique stp ?
fuckya Messages postés 125 Date d'inscription mercredi 31 mars 2004 Statut Membre Dernière intervention 8 juin 2006
4 mai 2005 à 10:46
Joli :)

if ($file !== '.' && $file !== '..') {

je remplacerais par if(!in_array($file, array('.', '..', '')))

je sais pas si c'est plus rapide ^_^
cs_twisteurwin Messages postés 167 Date d'inscription mardi 21 septembre 2004 Statut Membre Dernière intervention 2 mai 2009
4 mai 2005 à 10:37
De rien malalam ! :-)
ben le $file!='' est aussi important et ca fait toujours un parametre de plus dans ton if... maintenant tu as le choix de le laisser ou de l'enlever...
Perso j'ai toujours fais comme ca au cas ou mon code évolue...
pour while ($file=readdir($dh)) {
C'est encore moins optimisé je suis d'accord :-)
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
4 mai 2005 à 10:26
heu $file...lol

Et merci Twisteur, au fait :-)
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
4 mai 2005 à 10:25
=> twisteurwin
if($file != '..' && $file !='.' && $file !='')
??
Pourquoi...?
Comme le dirait Antho, la "triple comparaison" est plus rapide que la normale (plus rapide que), de plus, je compare bien deux chaines, donc 2 "trucs" du meme type.
Ensuite, le $file !='' ne sert a rien, je me fiche qu'il y ait ou un nom un fichier sans nom...
Par contre, ok pour les simples quotes, oubli de ma part.

Si Coucou veut dire ceci :
while (file=readdir($dh)) {
Je ne suis pas d'accord, lol.
cs_twisteurwin Messages postés 167 Date d'inscription mardi 21 septembre 2004 Statut Membre Dernière intervention 2 mai 2009
4 mai 2005 à 10:14
>malalam; Pour optimiser les echo (d'après moi )
if ($file !== "." && $file !== "..") {
deviendrait:
if($file != '..' && $file !='.' && $file !=''){
et
while(($file=readdir($bh)!=FALSE){
reste identique car je vois pas comment mieux l'optimiser...
Coucou je vais aussi être attentif à ta réponse ca m'interesse...
Sinon Malalam bonne source j'te met 8 car c'est un bon code :-)
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
4 mai 2005 à 09:25
T'as mis 7 et j'ai 9 ? Je ne m'attendais pas a autant de toutes facons lol.

Oui, en fait j'y ai pense pour les puces, puis j'ai oublie de tester. J'essayerai.

Pour les 2 echo, je suis d'accord, mais en general j'evite, pour des questions de lisibilite. Ceci dit, dans une fonction recursive...ca se justifie, oui.

Quant aux 2 autres lignes, j'avoue que je n'ai jamais trouve de moyen de mieux les optimiser, donc si tu as une suggestion...je suis preneur parce que ce sont 2 lignes que l'on utilise frequemment quand on code...!

Et merci :-)
coucou747 Messages postés 12303 Date d'inscription mardi 10 février 2004 Statut Membre Dernière intervention 30 juillet 2012 44
3 mai 2005 à 23:01
salut
if ($file !== "." && $file !== "..") {
et :
while(($file=readdir($bh)!=FALSE){
deux lignes non optimisées...

sinon, t'as deux echo à suivre, la concaténation serait la bien venue...

et sinon, pour la mise en valeur de $path, c'est pas optimisé non plus, tu pourrais tout mettre d'un coup : $path=$dir.'/'.$file;

sinon, ça a l'air pas mal, tu pourrais pe afficher les fichier avec des li et les dossiers avec des ul... mais ce n'est qu'une idée...

je mets 7
Rejoignez-nous