open dir

Invité
Invité n'ayant pas de compte PHPfrance

18 sept. 2006, 15:40

Je viens de trouver un script qui marche:
<?php 
$default_dir = "images2/"; 

function traverse_dir($dir, $indent = 0)
{
    $ind_str = str_repeat(" &nbsp; &nbsp;", $indent);
    
    chdir($dir);
    if(!($dp = opendir('.'))) die ("{$ind_str}can't open $dir.\n");

    while($file = readdir($dp))
    {
        if(is_dir($file))
        {
            if($file != '.' && $file != '..')
            {
                echo "{$ind_str}<b>$file</b><br>\n";
                traverse_dir("$file", $indent + 1);
            }
        }
        else echo "{$ind_str}$file<br>\n";
    }
    closedir($dp);
    chdir('..');
}

traverse_dir($default_dir); 
?> 
Je n'y comprends rien mais ça m'affiche tous les dossiers de mon site depuis la racine. Tous les dossier qui ne répondaient pas sont aussi affichés!

2 questions:
1- j'ai indiqué au début du script: $default_dir = "images2/";
ça m'affiche tout depuis la racine. Comment modifier le code pour lister uniquement images2.

2- Quelqu'un voit -t -il pourquoi ce script marche et pas un autre?
Voici le lien vers le post:
http://p2p.wrox.com/topic.asp?TOPIC_ID=650

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

18 sept. 2006, 15:41

Ce sujet était traité plusieurs fois, si tu veux des exemples de code il y en a des dizaines sur ce forum, il suffit de chercher (c'est pourquoi t'as pas eu beaucoup de réponses)

Utilise un chemin absolu pour atteindre ton dossier, vérifie l'orthographe des noms entre celui du dossier et celui utilsé dans opendir() un simple espace de trop et ça foire.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Invité
Invité n'ayant pas de compte PHPfrance

18 sept. 2006, 16:04

je ne cherche pas un exemple de code, j'en ai déjà trouvé plein, et je m'en suis déjà servi plusieurs fois.
Mon problème est que dans CE cas particulier ça ne marche pas, et j'essaye de comprendre avec l'aide de ce qui veulent bien m'aider.
J'ai fait une recherche sans trouver de réponse à mon cas, c'est pour ça que je poste.

Invité
Invité n'ayant pas de compte PHPfrance

18 sept. 2006, 16:12

pour répondre à tes remarques sadeq, ça ne peut pas être un pb de chemin. Comme je l'ai dit plus haut, j'ai 2 dossiers: images1 et images2.

Avec images1 le script marche, pas avec images2. A prioriça ne peut pas non plus etre une question d'espaces car les noms de dossier me semblent simples et clairs.

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

18 sept. 2006, 16:25

C'est un problème de permission NTFS alors. Il faut qu'au moins le system ait le droit de lecture sur le répertoire.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Invité
Invité n'ayant pas de compte PHPfrance

18 sept. 2006, 16:33

s'il s'agit de clic droit -> propriétés -> sécurité pour gérer les droits, j'ai vérifié

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

18 sept. 2006, 16:55

Si ton php était bien configuré pour le mode débug et donc affiche les erreurs il devait t'avertir dans ton dernier exemple par le message :

Code : Tout sélectionner

Warning: chdir() [function.chdir]: No such file or directory (errno 2)
Puisqu'il t'affiche toute la structure de ton site au lieu de seulement le dossier "image2" : ce dossier vraisemblablement n'existe pas dans le chemin relatif donné ou n'est pas un dossier.

ps: Ecoutes, j'ai testé ton script et il marche bien sauf dans les cas d'erreurs qu'on t'as déjà cité.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphanteau du PHP | 49 Messages

31 janv. 2007, 07:00

C'est un problème très connu avec php sous windows : is_dir() ne fonctionne pas correctement. Le fichier n'est pas détecté comme étant de type "répertoire" mais comme un fichier.
Ce qu'il y a de perturbant c'est que ça marche sur le premier dossier lu après "." et ".." mais pas sur les autres :x Je m'y suis cassé les dents plusieurs fois. J'uitilisel e code que tu as posté (la fonction recursive "traverse_dir()") mais je rencontre un souçaï avec chez free.
Sur un nunux perso ça marche très bien, sur ma page perso de free ( http://ghalaad.z.free.fr/ ) ça pinaille sur les fork quand il y a un appel à opendir()...
Et là ...
je suis perdu :(
function Listing($dir)
{
/* ça foire ici */
    if ($dh = @opendir($dir))
    {
        while(($file = @readdir($dh)) !== false)
        {
            if (!preg_match('/^\./s', $file) && $file != ".." && $file !=".")
            {
                if ((is_dir($dir . $file) || !ereg('\.', $file)))
                {
                    $newdir = $dir . $file . '/';
                    @chdir($newdir);
                    $t[$newdir][] = Listing($newdir);
                    if(!is_null($t[$newdir]))
                    {
                    	asort($t[$newdir]);
					}
                }
                else
                {
                    $t[] = $file;
                }
            }
        }
    }
    if ($dir != "./")
    {
        chdir('..');
        //closedir($dh);
    }
    return $t;
}
L'erreur renvoyée est :
Fatal error : opendir(./demos/) [... code ajax ...]: failed to open dir : No such file or directory in /mnt/121/sdc/5/c/ghalaad.z/ajax_server.php on line 41 ...
Line 41 qui correspond à opendir().

Je sais que j'aurai dû ouvrir un nouveau sujet mais les deux problèmes sont reliés car la même fonction est utilisée ...
Merci à tous :)