LISTE REPERTOIRE (DIR EN PHP)

Orange73 Messages postés 1375 Date d'inscription dimanche 28 novembre 2004 Statut Membre Dernière intervention 2 août 2011 - 23 avril 2009 à 11:14
cs_robinou Messages postés 31 Date d'inscription lundi 27 janvier 2003 Statut Membre Dernière intervention 22 décembre 2009 - 22 déc. 2009 à 23:03
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/49899-liste-repertoire-dir-en-php

cs_robinou Messages postés 31 Date d'inscription lundi 27 janvier 2003 Statut Membre Dernière intervention 22 décembre 2009
22 déc. 2009 à 23:03
je suis une grosse bouse, désolé, tout baigne ... joyeuses fêtes
cs_robinou Messages postés 31 Date d'inscription lundi 27 janvier 2003 Statut Membre Dernière intervention 22 décembre 2009
22 déc. 2009 à 22:57
Salut neigedhiver

J'utilise ton code mais erreur si un des répertoires est vide
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
27 mai 2009 à 14:51
Y'a vraiment pas besoin d'autant de lignes de code pour parcourir récursivement un répertoire... Exemple fait à l'arrache (mais qui fonctionne) :

<?php

class MyDir extends RecursiveIteratorIterator {

public function __construct($directory) {
$it = new RecursiveDirectoryIterator($directory);
parent::__construct($it, RecursiveIteratorIterator::SELF_FIRST);
}
}

echo '';
foreach ($oDir = new MyDir('/home/neige/opendev/') as $item) {
echo '<li>', str_repeat('-', $oDir -> getDepth()), $item -> getFilename(), '</li>';
}
echo '';

?>

Après, ça devient intéressant quand on commence à s'intéresser aux filtres et à la mise en forme du bazar produit. Mais la base est là.
seyvapul Messages postés 39 Date d'inscription vendredi 15 juillet 2005 Statut Membre Dernière intervention 4 juin 2017
27 mai 2009 à 14:43
Merci, je vais voir cela très vite, je sens que je vais gagner du temps.
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
27 mai 2009 à 14:37
Pour faire un parcours tout simple de répertoires, autant utiliser une classe étendue de DirectoryIterator avec RecursiveDirectoryIterator : c'est toujours plus clair qu'un appel récursif (qui certes fonctionne).

Cf l'excellente source de Malalam : http://www.phpcs.com/codes/PHP5-SMARTDIR-ITERATEURS-PHP-LECTURE-INTELLIGENTE-REPERTOIRE_40393.aspx

Sinon, <ol> c'est bien aussi, pour numéroter les fichiers.
seyvapul Messages postés 39 Date d'inscription vendredi 15 juillet 2005 Statut Membre Dernière intervention 4 juin 2017
27 mai 2009 à 14:21
Pour ceux que cela intéresse, je suis en train de coder une fonction de parcours de dossier.
Je vous met le code en dessous.
les variables $c et $f sont juste là pour le visuel, c'est pas fini mais cela donne déjà une idée.

DEBUT de test.php
<?php
# $c sert juste à indiquer le numero du dossier pour affichage.
# Liste_Dossier fait appel à la class PHP5 DirectoryIterator.
function Liste_Dossier($dossier,$c) {
# Construit un nouvel itérateur de dossier à partir de $dossier
$dir = new DirectoryIterator($dossier);
foreach ($dir as $fileinfo) {
$f = 0;
# -> IsDir() renvoie true si $fileinfo est un dossier.
# -> IsDot() renvoie true si fileinfo est '.' ou '..'.
# On ne parcours alors que les dossiers présents dans $dossier.
if($fileinfo -> IsDir() && !$fileinfo ->IsDot()) {
# Incrément de $c à chaque dossier trouvé.
++$c;
# Affichage pour voir que tout va bien.
# Possibilite de remplir une table pour y stocker les chemins, etc.
echo $c.' - '.$fileinfo.'
';
# Appel recursif de la fonction pour parcourir les sous dossiers.
# Augmentation de $c par 100 (prévoir plus si besoin :D )
Liste_Dossier($dossier.'/'.$fileinfo,$c*100);
}
# Traitement du cas d'un fichier.
# IsFile() renvoie true si $fileinfo est un fichier.
if($fileinfo -> IsFile()) {
# Incrément de $f à chaque fichier.
++$f;
# Affichage pour voir que tout va bien.
echo $f.' - F -'.$fileinfo.'
';
}
}
}
# Appel de la fonction ($c est ici égale à 0 - Début)
liste_Dossier(dirname(__FILE__),0);
?>
FIN de test.php

Je sais pas si cela peut aider, mais dans le doute ...
Dès que j'aurai fini mon codage, avec un peu de css pour que cela soit plus jolie, je mettrai ma source en ligne.
Pour les différents type de fichiers, pourquoi ne pas passer par une feuille xml, je crois que fhx a déjà traité le sujet.

@plus.
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
19 mai 2009 à 20:27
Salut,

Moi ce qui me désole c'est que c'est la 98326780489573Z94ème source à parcourir des répertoires avec opendir... Et en plus, readdir est mal utilisé...
C'est lassant quoi...
mephistope Messages postés 4 Date d'inscription mercredi 12 avril 2006 Statut Membre Dernière intervention 17 décembre 2009
30 avril 2009 à 16:05
Salut et merci pour vos précisions.
Je ne m'attendais vraiment pas a voir des commentaires sur ce code.
C'est noté pour les normes W3C (je comprenais pas pourquoi il y avais 500 erreurs sur 20 lignes) + les else if redondants + inutile $var1 = $var2 si elle ne doit pas etre modifié …
En tout cas vos réponses m'aident à mieux comprendre.
Un grand merci a vous 6 !
Je m’inspire du code proposé afin de faire les modifs et je re poste le code …
Ps : j’ai honte, car ce script était déjà une amélioration d’un code au résultat identique mais dons le nombre de lignes était multiplié par 10 et bugé a fond.
Rien que pour la date j’utilisais la fonction fileatime($var) qui renvoi le nombre de secondes passé depuis le 1er janvier 1970 , puis de la a faire les divisions pour arriver à une date valide ,alors que la fonction filemtime($var) le fait tres bien (re inveter la roue ;-)
@ tres bientot .
mephistope.
cs_UNi Messages postés 35 Date d'inscription vendredi 15 février 2002 Statut Membre Dernière intervention 27 avril 2009
27 avril 2009 à 09:25
Il existe une classe en PHP qui fait déjà très bien ce que tu essaye de faire !!
http://be.php.net/manual/fr/class.dir.php
Donc ca ne sert à rien de réinventer la roue ;)

Concernant l'affichage des images selon l'extension il y a beaucoup plus simple que de faire N if...elseif

Récupère l'extension de ton fichier et charge l'image correspondante si elle existe

$extension=strrchr($nomFichier,'.');
if (file_exists("images2/".$extension.".png"))
echo "<td></td>";
else
echo "<td></td>";
klicksoe Messages postés 38 Date d'inscription vendredi 9 mars 2007 Statut Membre Dernière intervention 23 avril 2009
23 avril 2009 à 16:31
Pas très respectueux des normes W3C tout ça :s
De plus, ce n'est pas "<?", mais "<?php" qu'il faut utiliser.
Pour tes extensions, comme l'a proposé Orange73 (mais un peu modifié), on regarde si l'image de l'extension existe et on l'affiche, sinon, on prend l'image de base :
$extension = strtolower($extension); // pour éviter les problèmes de casse
if (!is_file('images2/'.$extension.'.png')) { $extension='unkn'; } // si l'image n'existe pas, on donne l'extension unknow
echo ''; // on affiche l'image

Pour ton calcul de taille, tu pourrais utiliser une fonction également.
kankrelune Messages postés 1293 Date d'inscription mardi 9 novembre 2004 Statut Membre Dernière intervention 21 mai 2015
23 avril 2009 à 16:26
La technique pour récupérer l'extension est correcte c'est la gestion derrière pour afficher une image qui ne l'est pas... un switch serait plus simple et plus clair et le mieux serait d'externaliser le traitement dans une fonction à part... je dirais même que...

$ext = strtolower(substr(strrchr($nomFichier,'.'),1);
if(is_file(dirname(__FILE__).DIRECTORY_SEPARATOR.'images2'.DIRECTORY_SEPARATOR.$ext.'.png'))
echo '<td></td>';
else
echo '<td></td>';

j'obtiens le même résultat en 5 lignes de code que toi en 40 lignes... .. !

$dossier = opendir($folder);
while ($Fichier = readdir($dossier))

tu fais quoi s'il y a un pb d'ouverture du répertoir... ou si le répertoire cible n'existe pas... pareil si le répertoire s'appel 0 ta boucle s'arrêtera... également ton $nomFichier = $Fichier; est totalement inutile... .. .

if(($dossier = opendir($folder)) !== false)
{ while(false !($nomFichier readdir($dossier)))
{
// traitement
}
closedir($dossier);
}
else // gestion de l'erreur...

Tout dépend de l'utilité du code mais à mon avis inutile de le tourner en objet... la POO c'est bien en abuser ça craind... .. .

@ tchaOo°

ps: et remplace tes <? par <?php
faiblard Messages postés 337 Date d'inscription samedi 3 février 2007 Statut Membre Dernière intervention 4 janvier 2011
23 avril 2009 à 11:28
Et pourquoi ne pas utiliser path_info pour récupérer l'extension?

Faire plusieurs fois filesize sur la même variable et ridicule tu le fais une fois et tu le stock...
Teclis01 Messages postés 1423 Date d'inscription mardi 14 décembre 2004 Statut Membre Dernière intervention 29 décembre 2012 4
23 avril 2009 à 11:21
elseif, elseif, elseif, ... le tout dans l'affichage... mouais... j'ai rarement vu moins propre.
Bon et bien tu as gagné 3 choses :
1/passer en objet (il doit déjà exister moult fois)
2/faire un fichier de conf
3/reposter
Orange73 Messages postés 1375 Date d'inscription dimanche 28 novembre 2004 Statut Membre Dernière intervention 2 août 2011
23 avril 2009 à 11:14
hello,

1/ Utile et l'affichage permet de mieux visualiser l'arborescence.

2/ il faudrait faire une fonction récursive de ta source ainsi qu'une classe, pour que tout le monde puisse l'utiliser pour n'importe quel besoin.

3/ tu aurais pu simplifier et meme virer ton pavé de if()else if() par simplement la recuperation de l'icone via le nom de l'extension par une seule ligne :
echo '<td></td>'; // avec simple quotes en plus pour les echo
Rejoignez-nous