PHWinfo banniere

Titres
PORTAIL ANNUAIRE ARTICLES COMPARATEUR HÉBERGEURS DEVIS FORUMS RÉDUCTEUR D'URL
Précédent   PHWinfo > Autres forums > Forum Programmation & Conception > fr.comp.lang.php > Utiliser la fonction scandir en lieu et place de
S'inscrire FAQ Membres Recherche Messages du jour Marquer les forums comme lus
Utiliser la fonction scandir en lieu et place de

Réponse
 
LinkBack Outils de la discussion
Vieux 12/07/2007, 20h06   #1
AT
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Utiliser la fonction scandir en lieu et place de

Bonjour,
j'ai une fonction d'explorateur qui ne fonctionne
plus tres bien sous php5...

Le but etant d'explorer un repertoire et d'afficher
tous les dossiers de manières recursives, et
d'avoir sur chaque dossier un lien qui activera dans
une autre page (ou frameset) tous les fichiers qu'il contient...

J'aimerais la remplacer avec la nouvelle fonction
scandir, mais je n'y arrive pas...

Voila la pertie de fonction qui a l'air de merder..

function ExploreRepertoire($chemin)
{
$repind = 0;
$handle = @opendir($chemin);
$file = @readdir($handle); // repertoire .
$file = @readdir($handle); // repertoire ..
$niveau++;
while ($file = @readdir($handle))
{
if (is_dir("$chemin/$file"))
{
$tabRep[$repind] = $file;
$repInd++;
}
}
etc.......

et je voudrais la remplacer par quelque chose comme ça...
function ExploreRepertoire($chemin)
{
$tabrep = scandir($chemin);
for($i = 0; $i < count($tabrep); $i++)
{
if ( $tabrep[$i] == '.' || $tabrep[$i] == '..' )
{ unset($tabrep[$i]); }
}
sort ($tabrep);
}

Mais ça marche pas... je n'ai pas mis toute la fonction,
car il y'a plein d'html de partout...
Mais je cherche à la faire fonctionner en php5, et si possible
avec cettes fonction scandir qui a l'air de reduire pas mal le code...

Merci de vos conseils
AT
  Réponse avec citation
Vieux 12/07/2007, 22h07   #2
Olivier Miakinen
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Utiliser la fonction scandir en lieu et place de

Le 12/07/2007 21:06, AT a écrit :
> Bonjour,


Bonjour,

> Voila la partie de fonction qui a l'air de merder..
>
> function ExploreRepertoire($chemin)
> {


« $tabRep = array(); » au début ne peut pas faire de mal.

Au passage, j'éviterais les variables capitalisées car on a vite fait de
remplacer un « $tabRep » par un « $tabrep »... et plouf !

> $repind = 0;
> $handle = @opendir($chemin);


Tu as simplifié le code, ou tu ne testes vraiment pas le retour de cet
appel de fonction ? Il serait sage de le faire, d'autant que tu ignores
tous les codes d'erreur avec « @ ».

> $file = @readdir($handle); // repertoire .
> $file = @readdir($handle); // repertoire ..


Même s'il y a toutes les chances que les deux premières entrées soient
'.' et '..', pour ma part je testerais plutôt le cas dans la boucle
(comme tu le fais pour scandir).

> $niveau++;
> while ($file = @readdir($handle))


Attention, ta boucle s'arrêtera trop tôt dans certains cas, par exemple
si tu as un fichier qui s'appelle "0".

RTFM :
<http://fr.php.net/manual/fr/function.readdir.php>
/* Ceci est la façon correcte de traverser un dossier. */
while (false !== ($file = readdir($handle))) {
echo "$file\n";
}

/* Ceci est la MAUVAISE façon de traverser un dossier. */
while ($file = readdir($handle)) {
echo "$file\n";
}
</>

> {
> if (is_dir("$chemin/$file"))
> {
> $tabRep[$repind] = $file;
> $repInd++;


Tiens, qu'est-ce que je disais à propos des variables capitalisées !
Tu aurais beau incrémenter $repInd tant que tu voudras, $repind vaudra
toujours 0. Et plouf.

Au passage, tu n'as pas besoin de $repind/$repInd du tout. Il te suffit
d'écrire :
$tabRep[] = $file;

> }
> }
> etc.......
>
> et je voudrais la remplacer par quelque chose comme ça...
> function ExploreRepertoire($chemin)
> {
> $tabrep = scandir($chemin);
> for($i = 0; $i < count($tabrep); $i++)
> {
> if ( $tabrep[$i] == '.' || $tabrep[$i] == '..' )
> { unset($tabrep[$i]); }
> }


Ça me semble bien. Que donne print_r($tabrep) ?

> sort ($tabrep);


À priori ça devrait être inutile puisque le tableau est déjà trié. Si tu
veux juste renuméroter les index pour utiliser ensuite une boucle for()
comme ci-dessus au lieu d'une boucle foreach(), « array_merge($tabrep) »
devrait suffire.

> }
>
> Mais ça marche pas...


Hum... Il n'y a rien de pire en informatique que « ça marche pas ».
Il se passe quoi exactement ? Pour une liste de fichiers donnée, que
contient le tableau en sortie de boucle ?
  Réponse avec citation
Vieux 13/07/2007, 08h27   #3
Jean-Jacques SOLARI
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Utiliser la fonction scandir en lieu et place de

AT <allotobus@invalid.fr> wrote:

[...]

> et je voudrais la remplacer par quelque chose comme ça...
> function ExploreRepertoire($chemin)
> {
> $tabrep = scandir($chemin);
> for($i = 0; $i < count($tabrep); $i++)
> {
> if ( $tabrep[$i] == '.' || $tabrep[$i] == '..' )
> { unset($tabrep[$i]); }
> }
> sort ($tabrep);
> }


AT,

La fonction scandir effectue un tri par défaut donc pas besoin de sort.
Sinon voici une version qui devrait faire ce que tu souhaites :

function ExploreRepertoire( $chemin )
{
$tabrep = array();

$contenu = scandir( $chemin );
foreach( $contenu as $fichier )
{
if( is_dir($fichier) )
{
if( strpos($fichier), '.') === 0 ) continue;
$tabrep[] = $fichier;
}
}
return $tabrep;
}

Et tu fais ce que tu veux avec $tabrep qui contient les noms des
sous-répertoires de celui à explorer.

qça,

JJS.
  Réponse avec citation
Vieux 13/07/2007, 11h16   #4
Olivier Miakinen
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Utiliser la fonction scandir en lieu et place de

Le 13/07/2007 09:27, Jean-Jacques SOLARI a écrit :
> if( strpos($fichier), '.') === 0 ) continue;


Attention, ici tu élimines tout répertoire dont le nom commence par '.',
ce qui n'est peut-être pas ce que veut AT.

Une autre possibilité si on veut faire concis serait :
switch($fichier) { case '.': case '..': continue; }
  Réponse avec citation
Vieux 13/07/2007, 14h48   #5
Jean-Jacques SOLARI
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Utiliser la fonction scandir en lieu et place de

Olivier Miakinen <om+news@miakinen.net> wrote:

> Le 13/07/2007 09:27, Jean-Jacques SOLARI a écrit :
> > if( strpos($fichier), '.') === 0 ) continue;

>
> Attention, ici tu élimines tout répertoire dont le nom commence par '.',
> ce qui n'est peut-être pas ce que veut AT.


Tout à fait, mais c'est ce qui est voulu si on considère le bout de code
original, non ?

if ( $tabrep[$i] == '.' || $tabrep[$i] == '..' )
{ unset($tabrep[$i]); }

> Une autre possibilité si on veut faire concis serait :
> switch($fichier) { case '.': case '..': continue; }


Même si ça peut être difficile à maintenir ensuite, j'adooore ce
concis-là :-)

M'en servirai un de ces jours. Merci pour l'astuce.

JJS.
  Réponse avec citation
Vieux 13/07/2007, 17h02   #6
Olivier Miakinen
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Utiliser la fonction scandir en lieu et place de

Le 13/07/2007 15:48, Jean-Jacques SOLARI a écrit :
>
>> > if( strpos($fichier), '.') === 0 ) continue;

>>
>> Attention, ici tu élimines tout répertoire dont le nom commence par '.',
>> ce qui n'est peut-être pas ce que veut AT.

>
> Tout à fait, mais c'est ce qui est voulu si on considère le bout de code
> original, non ?
>
> if ( $tabrep[$i] == '.' || $tabrep[$i] == '..' )
> { unset($tabrep[$i]); }


Euh... ben non... le bout de code original n'écarte que '.' et '..'
alors que le tien écartera aussi '...', '.desktop', et ainsi de suite.

>> Une autre possibilité si on veut faire concis serait :
>> switch($fichier) { case '.': case '..': continue; }

>
> Même si ça peut être difficile à maintenir ensuite, j'adooore ce
> concis-là :-)


J'ai voulu faire aussi concis que toi pour l'exemple, mais
personnellement je préfère :

switch ($fichier) {
case '.':
case '..':
continue;
default:
/* ne rien faire */
}

> M'en servirai un de ces jours. Merci pour l'astuce.


:-)
  Réponse avec citation
Réponse


Outils de la discussion

Règles de messages
Vous ne pouvez pas créer de nouvelles discussions
Vous ne pouvez pas envoyer des réponses
Vous ne pouvez pas envoyer des pièces jointes
Vous ne pouvez pas modifier vos messages

Les balises BB sont activées : oui
Les smileys sont activés : oui
La balise [IMG] est activée : oui
Le code HTML peut être employé : non
Trackbacks are oui
Pingbacks are oui
Refbacks are oui


Fuseau horaire GMT +1. Il est actuellement 22h58.


Édité par : vBulletin® version 3.7.2
Copyright ©2000 - 2008, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.2.0 RC5 Tous droits réservés.
Version française #16 par l'association vBulletin francophone
PHWinfo est un site Éducation Sans Frontières
Ad Management by RedTyger
©Tous droits réservés par les parties respectives
Page generated in 0,12191 seconds with 14 queries