OVH Cloud OVH Cloud

probleme avec is_dir

6 réponses
Avatar
Tran
Bonjour



J'ai un problème avec is_dir.



function AfficheDossier ($chemin) {



$rep=opendir($chemin);

//chdir($chemin);



while ($file = readdir($rep)) {

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

echo $file;

echo "<br>";

AfficheDossier($chemin."/".$file);

}

}



closedir($rep);

}



Si je dé-commente "chdir($chemin);" is_dir fait correctement son test mais
lorsque la fonction se rappelle, j'ai une erreur (sûrement à cause de chemin
relatif ). Par contre, si je ne le dé-commente pas, is_dir ne fonctionne pas
correctement et ne m'affiche rien (le test est toujours faux).



Si quelqu'un a une idée pour remédié à ça. je suis preneur (surtout pour des
explications).



Merci d'avance

6 réponses

Avatar
Olivier Miakinen

Bonjour



J'ai un problème avec is_dir.


Avec les sauts de ligne aussi apparemment (tu ne sembles pas savoir
aller à la ligne sans sauter une ligne, sauf lorsque le changement de
ligne est automatique).

function AfficheDossier ($chemin) {
$rep=opendir($chemin);


Où est le test pour vérifier que opendir() a fonctionné ?

//chdir($chemin);


Cela ne devrait pas être utile. Laisser le commentaire ou virer la ligne.

while ($file = readdir($rep)) {


<cit. http://fr.php.net/manual/fr/function.readdir.php>
/* Ceci est la MAUVAISE façon de traverser un dossier. */
</cit.>

(la façon correcte est donnée juste au dessus dans la même page)

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


Ok, mais lors de tes tests tu devrais afficher aussi les fichiers qui ne
sont pas des répertoires (sans, bien sûr, rappeler AfficheDossier).

echo $file;
echo "<br>";


J'ai l'habitude de mettre des sauts de ligne de temps en temps, pour
rendre le code source plus lisible. Ça me semblerait une bonne idée ici,
c'est-à-dire :
echo "<br>n";

AfficheDossier($chemin."/".$file);


Ok.

closedir($rep);


Parfait.

Si je dé-commente "chdir($chemin);" is_dir fait correctement son test


Bizarre. Probablement un effet de bord.

mais lorsque la fonction se rappelle, j'ai une erreur (sûrement à
cause de chemin relatif ).


Ça me semble normal, cf. ci-dessus.

Par contre, si je ne le dé-commente pas, is_dir ne fonctionne pas
correctement et ne m'affiche rien (le test est toujours faux).


Lis bien la page de doc que j'ai citée plus haut, teste bien les
différents codes d'erreur possible, ajoute la trace des fichiers...
et reviens nous voir si tu n'as toujours pas résolu ton problème !

En passant, puisque ton adresse est invalide, il est de bon ton de le
signaler en la suffixant par « .invalid » (sans e) :
.
ou en majuscules :
.

Cordialement,
--
Olivier Miakinen
Troll du plus sage chez les conviviaux : le nouveau venu, avec
son clan, s'infiltre dans les groupes de nouvelles. (3 c.)

Avatar
Tran
Désolé, j'ai fait une mauvaise manip et le message est parti.
Donc aprés les modifications le fonctionnement est toujours identique et
j'en suis au même point.
Avatar
Tran
//chdir($chemin);
Cela ne devrait pas être utile. Laisser le commentaire ou virer la ligne.

Justement s'est à ce niveau que ça bloque


Ok, mais lors de tes tests tu devrais afficher aussi les fichiers qui ne
sont pas des répertoires (sans, bien sûr, rappeler AfficheDossier).
Je ne veux afficher que les dossiers


J'ai l'habitude de mettre des sauts de ligne de temps en temps, pour
rendre le code source plus lisible. Ça me semblerait une bonne idée ici,
c'est-à-dire : echo "<br>n";
entre echo "<br>n"; et echo "<br>"; je n'ai aucune difference d'affichage

?!?

En passant, puisque ton adresse est invalide, il est de bon ton de le
signaler en la suffixant par « .invalid » (sans e) :
Modifié


J'ai arrangé la fonction suivant les conseils (j'espère)

function AfficheDossier ($chemin) {
$rep=opendir($chemin) ;
if (!$rep) {
echo "erreur d'ouverture du dossier";
echo "<br>";
}
chdir($chemin);
while (false !==($file = readdir($rep))) {
if(($file != '..' && $file !='.' && $file !='') && is_dir($file)){
echo $file;
echo "<br>";
AfficheDossier($chemin."/".$file);
}
else {
echo "pas de dossier";
echo "<br>";
}
}
closedir($rep);
}

résultat avec chdir($chemin);

pas de dossier
pas de dossier
ADMINISTRATION
Warning: opendir(../creer liste fichiers/dossier unir/ADMINISTRATION):
failed to open dir: Invalid argument in d:program
fileseasyphp1-8wwwgestion_unirgerer donnees unirfonction_liste
dossier.php on line 37
erreur d'ouverture du dossier
Warning: chdir(): No such file or directory (errno 2) in d:program
fileseasyphp1-8wwwgestion_unirgerer donnees unirfonction_liste
dossier.php on line 42

Warning: readdir(): supplied argument is not a valid Directory resource in
d:program fileseasyphp1-8wwwgestion_unirgerer donnees
unirfonction_liste dossier.php on line 44

Warning: closedir(): supplied argument is not a valid Directory resource in
d:program fileseasyphp1-8wwwgestion_unirgerer donnees
unirfonction_liste dossier.php on line 81

En gros la fonction liste la racine(4 dossiers, je ne met pas toutes les
erreurs), pas les sous dossiers

Sans chdir($chemin);

pas de dossier
pas de dossier


Avatar
dwojylac.nospam
Tran wrote:

function AfficheDossier ($chemin) {
$rep=opendir($chemin) ;
if (!$rep) {
echo "erreur d'ouverture du dossier";
echo "<br>";
}
chdir($chemin);
while (false !==($file = readdir($rep))) {
if(($file != '..' && $file !='.' && $file !='') && is_dir($file)){
echo $file;
echo "<br>";
AfficheDossier($chemin."/".$file);
}
else {
echo "pas de dossier";
echo "<br>";
}
}
closedir($rep);
}


1. chdir fait changer de dossier or tu veux juste les lister donc pas
utile de même que closedir.

function AfficheDossier ($chemin) {
$rep = opendir($chemin) ;
if (!$rep) {
echo 'erreur d'ouverture du dossier <br />';
}
echo '<ul>'."n";
while (false !==($file = readdir($rep))) {
if($file != '..' && $file !='.' && $file !='') {
if (is_dir($file)) {
echo '<li>',$file, '</li>'."n";
AfficheDossier ($chemin.'/'.$file);
}
else {
echo '<li>',$file, '</li>'."n";
}
}
}
echo '</ul>'."n";
}

// pour afficher le contenu du dossier courant
AfficheDossier('./');

Si tu ne veux que les dossiers tu enlèves le else qui affiche les
fichiers.

Utiliser les balises ul et li permet d'afficher la profondeur de
l'arborescence.




--
Dominique
http://wojylac.free.fr

Avatar
Benjamin Malynovytch
Tran wrote:

Bonjour

J'ai un problème avec is_dir.

function AfficheDossier ($chemin) {
$rep=opendir($chemin);
//chdir($chemin);
while ($file = readdir($rep)) {
if(($file != '..' && $file !='.' && $file !='') &&
is_dir($file)){
echo $file;
echo "<br>";
AfficheDossier($chemin."/".$file);
}
}
closedir($rep);
}


Bonjour,

Il semblerait que tu ais oublié un détail : $file ne contient que le nom du
fichier/dossier en parcouru par readdir. La variable NE CONTIENT PAS le
chemin complet à ce fichier/dossier. Ca signifie que quand tu fais un
is_dir($file), tu testes is_dir("mon_chemin_en_cours/$file").

Il faut donc remplacer is_dir($file) par is_dir("$chemin/$file").

Cordialement,

Benjamin Malynovytch.

Avatar
Tran
Si ça peut aider quelqu'un j'ai trouvé mon erreur.

Comme le répertoire à lister n'est pas la ou ce trouve le script, j'ai été
obligé de fournir à is_dir le chemin réel du dossier.
if(($file != '..' && $file !='.' && $file !='') &&
is_dir(realpath($chemin)."/".$file))

Le php s'est sympa et j'ai encore des cheuveux, pourvu que ça dure