Sous-répertoire non reconnu comme étant des répertoires [Résolu]

Signaler
Messages postés
138
Date d'inscription
vendredi 28 février 2003
Statut
Membre
Dernière intervention
29 février 2008
-
Messages postés
138
Date d'inscription
vendredi 28 février 2003
Statut
Membre
Dernière intervention
29 février 2008
-
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

Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
22
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);
?>
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
22
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.
Messages postés
510
Date d'inscription
samedi 29 décembre 2001
Statut
Membre
Dernière intervention
23 mai 2008

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
-----------------
Messages postés
138
Date d'inscription
vendredi 28 février 2003
Statut
Membre
Dernière intervention
29 février 2008

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" ?)
Messages postés
138
Date d'inscription
vendredi 28 février 2003
Statut
Membre
Dernière intervention
29 février 2008

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 !
Messages postés
138
Date d'inscription
vendredi 28 février 2003
Statut
Membre
Dernière intervention
29 février 2008

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.
Messages postés
510
Date d'inscription
samedi 29 décembre 2001
Statut
Membre
Dernière intervention
23 mai 2008

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
-----------------
Messages postés
10840
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
22
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.
Messages postés
138
Date d'inscription
vendredi 28 février 2003
Statut
Membre
Dernière intervention
29 février 2008

Excuses acceptées...



...sans rancune



@+ et encore merci pour ton aide