Sous-répertoire non reconnu comme étant des répertoires

Résolu
cs_darkduck Messages postés 138 Date d'inscription vendredi 28 février 2003 Statut Membre Dernière intervention 29 février 2008 - 26 févr. 2006 à 17:58
cs_darkduck Messages postés 138 Date d'inscription vendredi 28 février 2003 Statut Membre Dernière intervention 29 février 2008 - 27 févr. 2006 à 13:52
Bonjour,



J'ulise la fonction suivante :



function recup_repertoires(&$liste_repertoires, $dir= './', $recursif=true, $inc=0)

{

$rep = opendir($dir);

while ($file = readdir($rep))

{

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

{

if (is_dir($file))

{

$liste_inc = '';




for($i=0; $i

9 réponses

malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
27 févr. 2006 à 11:24
Hello,

<?php
function recup_repertoires(&$liste_repertoires, $dir='.', $recursif=true)
{
$rep = opendir($dir); while (false !($file readdir($rep)))
{
if(!in_array ($file, array ('.', '..')))
{
if (is_dir($dir.'/'.$file))
{
array_push($liste_repertoires,$dir.'/'.$file);


if ($recursif === true)
recup_repertoires($liste_repertoires, $dir.'/'.$file, true);
}
}
}


closedir($rep);
clearstatcache();
}


$liste = array(); //Initialisation
recup_repertoires($liste);
print_r ($liste);
?>
3
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
27 févr. 2006 à 12:08
C'est de l'optimisation, ça ?
Lol, en l'occurence, ma version est plus rapide.
Et j'explique :

"J'ai remplacé : while (false !($file readdir($rep)))
Par :
while ($file = readdir($rep))
"
> tu as grand tort ;-) Partce que si tu as un répertoire ou un fichier s'appellant '0', ta fonction, avec ta version, va s'aarrêter...'0' = false en php. Donc la condition de ton while ne sera plus remplie.
Mais, en php, '0' !== false (on teste sur le type).

Idem pour la 2ème réflexion :
"Et :
if ($recursif === true)
Par :
if ($recursif)""Raison : Etant donné que les tests sont fait sur des variables (ou méthodes) qui sont (ou retournent) des bouléens, ce n'est pas la peine de vérifier $true (ou $false) et != $true (ou != $false)"

Certes, sauf que lorsqu'on code, on essaye d'être strict : tu attends un booleen, true, ou false. Donc, tu testes que c'en est bien un. Et encore une fois, avec ton code, je peux passer 'bla' au lieu de true, ton code prendra ça comme un true. Ce qui est incorrect.
D'ailleurs, si tu avais testé le type correctement, tu te serais rendu compte, dans ta 1ère version, que ta fonction ne rentrait pas dans l'appel rtécursif : tu avais inversé, dans l'appel récursif, le true et le chemin du sous-répertoire. Or, ta fonction a pris ce chemin comme équivalent à true puisque tu ne précisais pas ce que tu attendais.
Or, si $recursif = 'dir/sous-dir', if ($recursif) renvoie true.
3
WhiteDwarf Messages postés 510 Date d'inscription samedi 29 décembre 2001 Statut Membre Dernière intervention 23 mai 2008
26 févr. 2006 à 19:08
Premièrement je nepense pas que l'on puisse directement dans l'intitulé de la fontcion enter une variable et directement donner sa valeur, ca ne marche pas comme ca...

tu devrai plutôt l'écrire comme ca :



<HR>




<?php
function recup_repertoires($dir,$recursif)
{
$rep = opendir($dir);
while ($file = readdir($rep))
{
if($file != '..' && $file !='.' && $file !='')
{


if (is_dir($file))
{



echo "
$recursif $file" ;
$recursif .= "---";
recup_repertoires($dir ."/". $file,$recursif);
$recursif = "";
}}
}


closedir($rep);
clearstatcache();
}


recup_repertoires(".","");


?>



<HR>




----------------------
La lumière étant plus rapide que le son, un homme peu paraître brillant avant qu'il se mette a parler
-----------------
0
cs_darkduck Messages postés 138 Date d'inscription vendredi 28 février 2003 Statut Membre Dernière intervention 29 février 2008 1
27 févr. 2006 à 01:19
Premièrement je nepense pas que l'on puisse directement dans l'intitulé
de la fontcion enter une variable et directement donner sa valeur, ca
ne marche pas comme ca...



Si ça marche comme ça, qd on met une
valeur dans l'intitulé de la fonction, ça permet de donner une valeur
par défaut à la variable passée en paramettre ce qui fait que si on ne
lui donne pas de valeur dans l'appel, elle prend la valeur "par défaut"



Ex :

Si j'appelle recup_repertoires(&$liste_repertoires)

$dir sera égal à './'

$récursif sera égal à true

$inc sera égal à 0



Alors que si j'appelle recup_repertoires(&$liste_repertoires, 'mon_repertoire/', false)

$dir sera égal à 'mon_repertoire/'


$récursif sera égal à false


$inc sera égal à 0



Espérant en avoir aidé plus d'un.....



...je n'ai cependant toujours pas la réponse à ma question (pourquoi is_dir($file) retourne false quand $file est un sous-repertoire alors que is_dir($file) retourne true, quand $file est un répertoire "simple" ?)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_darkduck Messages postés 138 Date d'inscription vendredi 28 février 2003 Statut Membre Dernière intervention 29 février 2008 1
27 févr. 2006 à 11:45
Cool, merci ça marche très bien !!!! Chapeau !



J'ai juste optimiser un peu la fonction :



function recup_repertoires(&$liste_repertoires, $dir= '.', $recursif=true)

{

$rep = opendir($dir);

while ($file = readdir($rep))

{

if(!in_array ($file, array ('.', '..')))

{

if (is_dir($dir.'/'.$file))

{


array_push($liste_repertoires,$dir.'/'.$file);



if ($recursif)


recup_repertoires($liste_repertoires, $dir.'/'.$file, true);

}

}

}



closedir($rep);

clearstatcache();

}



$liste = array(); //Initialisation

recup_repertoires($liste);

print_r ($liste);





J'ai remplacé :

while (false !($file readdir($rep)))

Par :

while ($file = readdir($rep))



Et :

if ($recursif === true)

Par :

if ($recursif)



Raison : Etant donné que les tests sont fait sur des variables
(ou méthodes) qui sont (ou retournent) des bouléens, ce n'est pas la
peine de vérifier $true (ou $false) et != $true (ou != $false)



Merci encore !
0
cs_darkduck Messages postés 138 Date d'inscription vendredi 28 février 2003 Statut Membre Dernière intervention 29 février 2008 1
27 févr. 2006 à 13:16
Ok.

Je n'aime pas trop le ton que tu prends mais merci pour les explications.



Je ne connaissais pas !et je croyais que tu avais saisi trop vite.
0
WhiteDwarf Messages postés 510 Date d'inscription samedi 29 décembre 2001 Statut Membre Dernière intervention 23 mai 2008
27 févr. 2006 à 13:36
Waaa, on apprends des trucs tous les jours en tout cas très instructif, bon code bravo et merci, je vais faire quelques modifs sur mon "Web FTP" ... :p

@++


----------------------
La lumière étant plus rapide que le son, un homme peu paraître brillant avant qu'il se mette a parler
-----------------
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
27 févr. 2006 à 13:39
Désolé pour le ton : le but n'était pas d'être blessant, du tout. Mais si tu l'as ressenti ainsi, je suppose que je l'ai été.
Désolé, donc.
0
cs_darkduck Messages postés 138 Date d'inscription vendredi 28 février 2003 Statut Membre Dernière intervention 29 février 2008 1
27 févr. 2006 à 13:52
Excuses acceptées...



...sans rancune



@+ et encore merci pour ton aide
0
Rejoignez-nous