open dir

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : open dir

par ghalaad » 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 :)

par sadeq » 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é.

par Invité » 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é

par sadeq » 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.

par Invité » 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.

par Invité » 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.

par sadeq » 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.

par Invité » 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

par zeus » 18 sept. 2006, 15:25

Est-ce que tu as une gestion des droits sur ces dossier ?
un .htaccess par exemple :-k

par Invité » 18 sept. 2006, 15:06

si je renomme mon seul dossier qui fonctionne, lui aussi ne répond plus...snif.

par Invité » 18 sept. 2006, 14:59

il n'y a aucune fonction qui permette de contourner opendir ?

par Invité » 18 sept. 2006, 14:54

pareil, tous les nouveaux dossiers que je crée ne marchent pas.
Poutant surle même serveur, j'ai le même script de lecture qui tourne pour un autre site sans problème.

par Invité » 18 sept. 2006, 14:49

Réponse aux questions:
1- Le répertoire est créé via windows
2- Le chemin est bon, puisque la lecture du dossier images1 fonctionne
3 -Je fais bien

Complément d'info:
J'ai 4 autres dossiers qui contiennent divers fichiers sur mon serveur local.
a lecture de dossier ne fonctionne que pour images1/
Les autes dossiers (css/, divers/...) ne répondent pas non plus.

Si je fais un copier-coller du dossier images1/ qui fonctionne, sa copie de fonctionne pas!

par zeus » 18 sept. 2006, 13:57

essaye également d'afficher le répertoire dans lequel tu te trouves au cas où tu ais mélanger 2 espaces physique ;)
echo $_SERVER['PHP_SELF'];

par Ryle » 18 sept. 2006, 13:52

Comment crées-tu le répertoire ? via windows ou en php ?
Ton dossier est bien dans le répertoire ou s'exécute le script php ?
Est ce que tu fais bien des closedir() une fois que tu n'as plus besoin de la ressource ?
Tu peux essayer de redémarre easyphp (voire windows), ça pourrait peut être libérer des accès ou des verrous sur le dossier... :)