mini gestionnaires fichier et dossier

Eléphant du PHP | 100 Messages

17 févr. 2012, 15:28

Bonjour,

J'ai un petit soucis, je suis en train de faire un mini gestionnaire de fichier et de dossier en utilisant cette fonction :

Code : Tout sélectionner

function list_dir($name, $level=0) { if ($dir = opendir('./files/'.$name.'')) { while($file = readdir($dir)) { for($i=1; $i<=(4*$level); $i++) { echo "&nbsp;"; } echo "$file<br>\n"; if(is_dir($file) && !in_array($file, array(".",".."))) { list_dir($file,$level+1); } } closedir($dir); } }

quand il rencontre un fichier il devrait le décaller mais cela ne fonctionne pas.
Les fichiers et dossiers en questions sont dans un dossier.

Merci de votre aide,

Cordialement,

ViPHP
ViPHP | 2287 Messages

17 févr. 2012, 15:31

Bonjour,

Tu peux mettre un echo au début de cette fonction récursive pour voir comment elle se comporte, ainsi que les paramètres reçus à chaque appel. Ainsi tu pourras voir pourquoi elle ne fonctionne pas comme tu le souhaites.
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Eléphant du PHP | 100 Messages

17 févr. 2012, 16:08

elle fonctionne quand je l'utilise à la racine de mon répertoire, mais quand c'est pour afficher simplement le contenu d'un dossier dans ce répertoire cela ne fonctionne pas je suis un peu perdu

Eléphant du PHP | 179 Messages

17 févr. 2012, 16:26

Je pense que cela doit venir du chemin que tu envoies a ta fonction, car le chemin à la racine ou dans un répertoire n'est pas le même... enfin simple supposition

ViPHP
ViPHP | 2287 Messages

17 févr. 2012, 16:36

elle fonctionne quand je l'utilise à la racine de mon répertoire, mais quand c'est pour afficher simplement le contenu d'un dossier dans ce répertoire cela ne fonctionne pas je suis un peu perdu
C'est à dire ? As-tu fait l'echo ? Ça affiche quoi, au lieu de quoi ?

Il faut être précis, si tu veux de l'aide, on ne sait pas avec quels répertoires tu fais le test :)
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Eléphant du PHP | 100 Messages

17 févr. 2012, 18:54

le echo de $name me renvoie un "."

sinon je vais donc être plus préçis;

J'ai un dossier filer qui contient tout mon site, dans ce dossier il y a d'autre dossier dont un qui s’appelle files dedans et dans files encore d'autres dossier et ma fonction sert à me lister les dossiers et fichiers du dossier files.
Cela fonctionne bien mais pas comme je le voudrais, j'aimerais que les fichiers sont décalé par rapport aux dossiers.(pour faire comme une arborescence). Cela fonctionne bien quand je demande à cette fonction de me lister tout ce qu'il y a dans le répertoire filer (qui contient tout mon site) mais pas quand je lui demande de faire la même chose sur mon dossier files.

J'espère avoir était plus clair.

Cordialement,

ViPHP
ViPHP | 2287 Messages

17 févr. 2012, 19:11

Un peu plus clair oui, mais à l'avenir il faudrait vraiment éviter l'expression "ne fonctionne pas", elle n'a de sens que pour toi et n'informe en rien tes lecteurs sur le problème que tu es seul à voir (aucun symptôme décrit...).

Ta fonction est récursive et est appelée sur un dossier contenant d'autres dossiers, donc un echo $name placé au début devrait afficher plusieurs choses et pas un simple '.'. Il y a donc un problème dans la condition de récursion (le if() juste après l'echo), pense à examiner attentivement les conditions de ce if et les paramètres à l'aide d'un echo (sur $file par exemple).

Accessoirement, tu peux jeter un oeil sur str_repeat() si tu souhaites alléger un peu ton code au niveau des &nbsp;
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Eléphant du PHP | 100 Messages

17 févr. 2012, 19:32

J'ai fais un echo de $file ce qui me renvoie '..'
Après je débute dans la récursivité et je dois dire que je n'y comprend pas grand chose.

J'appelle ma fonction comme ceci :

Code : Tout sélectionner

list_dir(".");

je ne sais pas pourquoi il y a en paramètre de la fonction un point.
je me suis fortement inspiré des démonstrations présentent ici : http://cyberzoide.developpez.com/php4/file/

Alors si une âme charitable pourrait m'expliquer et me montrer je le remercie d'avance.

Cordialement,

ViPHP
ViPHP | 2287 Messages

17 févr. 2012, 22:58

J'ai fais un echo de $file ce qui me renvoie '..'
Après je débute dans la récursivité et je dois dire que je n'y comprend pas grand chose.
En très rapide : une fonction qui s'appelle elle-même. C'est bien adapté au parcours de structures de données en forme d'arbre (par exemple, un système de fichiers).

Il faut faire spécialement attention en écrivant une fonction récursive aux conditions qui limitent la récursion (dans ton cas, le deuxième if() ) et aux paramètres transmis à l'appel récursif lui-même (souvent, ils changent d'appel en appel).
J'appelle ma fonction comme ceci :

Code : Tout sélectionner

list_dir(".");

je ne sais pas pourquoi il y a en paramètre de la fonction un point.
Dans chaque dossier de ton système tu as deux "alias" de dossiers présents partout : "." pour le répertoire courant, et ".." pour le répertoire parent.
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Eléphant du PHP | 100 Messages

17 févr. 2012, 23:45

je dois dire que c'est encore un peu flou et je ne comprend pas non plus cette ligne :

Code : Tout sélectionner

if(is_dir($file) && !in_array($file, array(".",".."))) { list_dir($file,$level+1);
plus particulièrement ceci :

Code : Tout sélectionner

!in_array($file, array(".",".."))
Je teste pas mal de chose mais je n'arrive pas au résultat voulu encore

Eléphant du PHP | 100 Messages

18 févr. 2012, 20:48

je me suis pas mal renseigné et je commence déjà à mieux comprendre le principe de fonctionnement et je suis repartit sur un code plus compréhensible pour moi qui est celui là :

Code : Tout sélectionner

function liste_rep($src_dir) { $dir = opendir($src_dir); while($nom = readdir($dir)) { if ($nom!="." && $nom!="..") { $chemin=$src_dir ."/".$nom; if (is_dir($chemin)) { echo($chemin . "<br>"); liste_rep($chemin); } } } closedir($dir); }
et je l'appelle comme ceci :

Code : Tout sélectionner

liste_rep("./files");
voici le résultat :

Image

Tout d'abord j'aimerais voir disparaître le répertoire dans lequel se situe les dossiers et fichier en l’occurrence ici ./files
et puis j'ai un autre petit soucis j'ai plus que les dossiers qui s'affichent, les fichiers ne s'affichent plus
et encore un autre petit soucis si j'ai un dossier toto avec un sous dossier tata cela donne ceci :
./files/toto/tata
et si j'ai un dossier toto avec un sous dossier tata et un autre sous dossier titi alors cela donne :
./files/toto/tata
./files/toto/tata/titi
Il m'affiche ces deux lignes car je pense que quand la fonction boucle la première fois il voit un sous dossier donc il affiche et quand il reboucle dessus il en revoit un(de dossier) donc il ré-affiche mais j'aimerais corriger ce petit soucis.

Merci beaucoup de votre aide,

Cordialement,

ViPHP
ViPHP | 2287 Messages

18 févr. 2012, 22:44

Tout d'abord j'aimerais voir disparaître le répertoire dans lequel se situe les dossiers et fichier en l’occurrence ici ./files
Un petit substr() à l'affichage peut-être ?
et puis j'ai un autre petit soucis j'ai plus que les dossiers qui s'affichent, les fichiers ne s'affichent plus
C'est tout simplement parceque ton echo est actuellement placé dans un if(is_dir()). C'est comme ça se lit, en fait :)
et encore un autre petit soucis si j'ai un dossier toto avec un sous dossier tata cela donne ceci :
./files/toto/tata
et si j'ai un dossier toto avec un sous dossier tata et un autre sous dossier titi alors cela donne :
./files/toto/tata
./files/toto/tata/titi
Il m'affiche ces deux lignes car je pense que quand la fonction boucle la première fois il voit un sous dossier donc il affiche et quand il reboucle dessus il en revoit un(de dossier) donc il ré-affiche mais j'aimerais corriger ce petit soucis.
Tu veux dire que tu souhaites te limiter au premier niveau de récursion et donc ne pas parcourir les niveaux suivants ?
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Mammouth du PHP | 2278 Messages

18 févr. 2012, 23:09

Je pense que ce qu'il voudrait c'est que à un niveau donné, on n'affiche pas le chemin qui y vient contrairement à ci-dessous:
/files
liste des fichiers du dossier files
/files/tata
liste des fichiers du dossier tata
/files/tata/titi
liste de fichiers du dossier tata/titi
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Eléphant du PHP | 100 Messages

19 févr. 2012, 03:35

substr() ? je viens de bien lire la doc et je ne sais pas si cela va pouvoir m'aider je pense que c'est surtout quelque chose à modifié dans mon code mais quand j'essaie de l'enlever impossible de l'afficher.
Auriez vous une idée de modification de mon code à apporter pour que cela fonctionne ?
C'est tout simplement parceque ton echo est actuellement placé dans un if(is_dir()). C'est comme ça se lit, en fait :)
Le problème si je met un echo $nom; à ce moment cela m'affiche bien les fichiers mais cela me ré-affiche aussi les dossiers du coups j'ai les dossiers en double.
Tu veux dire que tu souhaites te limiter au premier niveau de récursion et donc ne pas parcourir les niveaux suivants ?
Non pas vraiment je me suis mal exprimé je pense, je veux qu'il m'affiche enfaite le dernier niveau seulement et pas les intermédiaires.

Merci de votre aide,

Cordialement,