LISTER LES DOSSIERS, SOUS-DOSSIERS ET NOMBRE DE FICHIERS

Messages postés
624
Date d'inscription
mardi 6 mai 2003
Statut
Membre
Dernière intervention
14 décembre 2009
- - Dernière réponse : mahlaoui
Messages postés
29
Date d'inscription
lundi 10 décembre 2007
Statut
Membre
Dernière intervention
13 octobre 2008
- 7 avril 2008 à 16:16
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/46237-lister-les-dossiers-sous-dossiers-et-nombre-de-fichiers

mahlaoui
Messages postés
29
Date d'inscription
lundi 10 décembre 2007
Statut
Membre
Dernière intervention
13 octobre 2008
-
Merci
Morphinof
Messages postés
261
Date d'inscription
vendredi 20 avril 2007
Statut
Membre
Dernière intervention
9 août 2013
3 -
C'est sur que ici l'intéret de la transformation est inexistant mais je voyais plutôt sa du côté exercice que utilisation.
Autant commencer par une source simple.
Il peu tout aussi bien faire autre chose mais il peu aussi essayer de voir ce que donnerai sa source version objet, c'était juste une idée de premier essai en POO ^^
Maintenant c'est sur que il y a surment mieu à faire que ca comme exercice pour débuter en POO, le mieu c'est de commencer par lire un peu et apprendre les notions de bases.
Bien évidement faire de la POO pour faire de la POO présente peu d'intérêt il faut quand même avoir un minimum de raison de le faire, si la POO présente énormément d'avantages elle à aussi ses inconvénients et il est certain que dans certains cas il n'est pas nécéssaire de passer par la.
Pour finir je suis tout à fait d'accord sur ce que disais Codefalse quand on à des outils performants à notre disposition autant les utiliser plutôt que réinventer la roue ;)
codefalse
Messages postés
1127
Date d'inscription
mardi 8 janvier 2002
Statut
Modérateur
Dernière intervention
21 avril 2009
1 -
Je savais que parler de SPL allait te faire plaisir Malalam ;)
malalam
Messages postés
10843
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
17 -
Hello,

transformer cette source en objet? Pourquoi faire ? Pour du didactique, autant créer un code qui a un intérêt à être codé en POO. Celui-là n'en a pas. Et transformer ce code en objets ferait apprendre une très mauvaise chose : faire de la poo pour faire de la poo. Ce qui est une très mauvaise vision de la programmation.

@neo2k2 => attention quand même...la récursivité et l'itératif ne sont pas opposés. On peut très bien utiliser les deux au sein d'un même code. Ca a à vrai dire tout son intérêt dans un code comme le tien : j'itère pour parcourir un répertoire, je fais du récursif quand je rencontre un nouveau répertoire.

Et là ou codefalse a raison : PHP comprend de superbes extensions orientées objet pour faire ce genre de choses TRES facilement. Mais ça n'implique pas que TON code doive être en objet.
Quand je fais : $ dir = new SplDirectory; while($dir->valid()) {echo $dir->current();}
j'utilise de la poo...je n'ai pas écrit un code orienté objet. Nuance.
neo2k2
Messages postés
126
Date d'inscription
jeudi 16 janvier 2003
Statut
Membre
Dernière intervention
9 novembre 2009
2 -
Morphinof>>> c'est ce que je vais faire dans les prochains jours dès que j'aurai 10 min. Je suis d'accord avec toi, ça sera un bon exercice.

Neigedhiver>>> contrairement à ce que tu peux penser :) je ne crois pas être un débutant après 15 ans d'informatique dont 10 de programmation (dont 1 en école d'ingénieur à expliquer l'itératif AVANT la récursivité) et un ordinateur n'est pas une boîte noire pour moi mais comme tu le dis très bien, je suis parti sur de mauvaises habitudes de programmation séquentielle. Désolé, ça ce sont les réminiscences fainéantes de Pascal, vb6...

Alors voila, c'est décidé, je me (re-)met à la récursivité et la poo!
Morphinof
Messages postés
261
Date d'inscription
vendredi 20 avril 2007
Statut
Membre
Dernière intervention
9 août 2013
3 -
Neo2k2 un très bon exercice pour commencer la POO sa serais de transformer ta source en objet ;)
Personnelement depuis que je suis passé de l'itératif à l'objet je ne fait plus que sa et je penses que j'arriverai plus à faire de l'itératif / séquentiel, disons que je ferais tout pour éviter sa ne serais-ce que pour la lisibilité et la structure du code ^^
Met toi y le plus vite possible, autant prendre de bonnes habitudes, et tu trouvera ici de nombreuses sources de tout niveau pour t'y mettre :)
neigedhiver
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
13 -
Salut,

C'est vraiment ne pas avoir conscience des réalités de la vie que de dire qu'un débutant doit commencer avec du séquentiel.
J'ai déjà vu une débutante ici se mettre en moins de 15 jours à la POO en PHP5, en utilisant la SPL et les itérateurs. Ca existe. C'était une fille en plus (on va dire que je fais le macho lol), et surtout : elle n'était pas informaticienne.

Ma source ne nécessite pas d'inclure 20 fichiers, elle ne nécessite pas non plus de modifier son code. Je suis désolé, mais j'ai pas l'impresseion qu'elle soit difficile à utiliser, même pour un débutant. Y'a qu'à voir l'exemple que j'ai donné...
Un débutant aura peut-être du mal à comprendre chaque subtilité du code, je ne le nie pas. Mais pour ce qui est de l'utiliser... Tu arrives bien à utiliser un ordinateur sans pour autant savoir comment est gérée la mémoire, le processeur, les bus, etc.

Ta source, finalement, n'apporte rien : parcourir un répertoire et afficher les fichiers, on trouve un exemple dans la doc de PHP (à la fonction readdir), même s'il est vrai que beaucoup de soit-disant non débutant ne sont même pas capables de comprendre ce qu'on y trouve... Tiens, par exemple, toi. La doc de PHP dit que la fonction readdir() peut retourner FALSE, mais aussi des valeurs qui sont interprétées comme telles par un simple test == (ou != ) : 0 ou ""
Il faut donc faire un test d'identicité avec === (ou !==)

Dans ta source, on trouve :
while ($file = readdir($handle))

Ben c'est une grosse erreur qui est pourtant indiquée dans la doc. Il FAUT écrire :while (false !($file readdir($handle))) {

Donc non seulement ta source n'apporte rien, mais en plus elle est bugguée et est difficilement utilisable et intégrable par un débutant...

Je ne dis pas que la POO c'est la panacée et qu'il faut absolument tout développer en objet. Non. Pour lister un répertoire, un objet n'est pas indispensable, une simple fonction peut suffire selon ce qu'on veut faire et selon le cas particulier de chacun.
Mais une simple fonction serait beaucoup plus facile à utiliser par un débutant qu'un code bourré de HTML.

Bon et puis j'en ai pas après toi personnellement, hein : juste après ta source.
codefalse
Messages postés
1127
Date d'inscription
mardi 8 janvier 2002
Statut
Modérateur
Dernière intervention
21 avril 2009
1 -
Sache, tant que j'y pense, que PHP5.2, grâce à la SPL, propose des fonctionnalités vraiment intéressantes pour les dossiers et fichiers. Jette un oeil du coté de DirectoryIterator par exemple.
Plus d'infos à http://www.php.net/~helly/php/ext/spl/
neo2k2
Messages postés
126
Date d'inscription
jeudi 16 janvier 2003
Statut
Membre
Dernière intervention
9 novembre 2009
2 -
J'y travaille... Faut que je me remette à la poo... ;o)
codefalse
Messages postés
1127
Date d'inscription
mardi 8 janvier 2002
Statut
Modérateur
Dernière intervention
21 avril 2009
1 -
Tout d'abord, un petit proverbe "Itérer est humain, récurser est divin" :p

Ensuite, Neo2k2, tu dit que l'on trouve à foison des exemples de codes qui ne sont pas en objets. La raison est simple. Php4 est plus vieux que Php5 (oué ca fait un peu trop facile, mais c'est pourtant vrai). Comme il est plus vieux, il à plus d'exemples. Ajoute à cela le fait que beaucoup d'utilisateurs ont eu du mal de passer à php5 (pourquoi ? je n'en sais rien). La preuve, Free à mis du temps avant de proposer un support Php5 ! Du coup, on fait avec ce que l'on as :p

Tu me dira que php4 permet de faire de la poo, mais le niveau de possibilité proposé par php4 n'est pas du plus intéressants (portés des éléments, etc). Du coup, beaucoups de développeurs sont restés au séquentiel.
Prouve ta différence, développe en objet !

Techniquement, si ton code est bien fait, l'utilisateur moyen n'aura besoin d'inclure qu'un fichier, la classe mère. Ce fichier s'occupera de charger le reste. Et du coup, ca devient tout de suite plus simple :
<?php
include "DirectoryLister.php";
$oDir = new DirectoryLister ('./images/');
echo 'Il y a '.$oDir->folder->count ().' dossiers et '.$oDir->files->count ().' dossiers, contenus dans '.$oDir->folder->getLevels ().' niveaux de profondeurs. La taille maximale d'un fichier est '.$oDir->files->getMaxSize ().' et la taille moyenne est '.$oDir->files->getAverageSize ().'.';
// etc
?>

Où est-ce que c'est compliqué ? :)
neo2k2
Messages postés
126
Date d'inscription
jeudi 16 janvier 2003
Statut
Membre
Dernière intervention
9 novembre 2009
2 -
Certes, je ne peux que vous accorder raison concernant la poo et la récursivité. Pour ma défense, je dirai cependant que la majorité des exemples que l'on trouve sur le net ne vont pas encore dans ce sens et que l'itératif et le séquentiel se trouvent à foison.

La source de Neigedhiver est excellente, je le reconnais sans réserve, mais ne pensez-vous pas que pour des débutants ce n'est pas toujours évident d'avoir à "installer" ~20 fichiers pour afficher un résultat similaire à ma source?

Je rappelle que mon code est là à titre d'exemple de source pour débutants pour comprendre une méthode pour lister les fichiers/dossiers.

Je ferai toutefois en sorte d'améliorer ma source en récursif, dans un premier temps.
Morphinof
Messages postés
261
Date d'inscription
vendredi 20 avril 2007
Statut
Membre
Dernière intervention
9 août 2013
3 -
Je suis de l'avis de neigedhiver, cette source est difficilement utilisable sans avoir à la modifier.
L'avantage d'avoir une source en objet c'est aussi en dehors de ce que disais très justement neigedhiver c'est en plus de pouvoir séparer l'affichage du traitement, sans compter que pour l'affichage d'arborescences il est nettement préférable de faire du récursif question de rapidité.
Sinon au niveau du code c'est propre :)
neigedhiver
Messages postés
2483
Date d'inscription
jeudi 30 novembre 2006
Statut
Membre
Dernière intervention
14 janvier 2011
13 -
Dire que je m'étais cassé le c** pour faire une source qui fait ça mais en objet, en déplorant justement qu'à l'heure de PHP5 (à l'aube de PHP6) certains continuent de faire du procédural pour lister le contenu d'un répertoire...

Récupérer l'extension d'un fichier (c'est d'ailleurs dans ma source) :

$ext = preg_replace('.*`\.([^\.]+)$`i', $filename, '$1');

Sinon, ouais, c'est propre, mais y'a même pas une fonction... C'est du séquentiel non réutilisable. C'est propre, ouais... Est-ce que ça fait trop "j'me la pète" si je rappelle qu'avec ma source ce qui est fait la se fait en 3 lignes de manière totalement intégrable, personnalisable et configurable ? Ouais p'têtre...

Désolé si j'ai l'air de faire le mec qui casse sec et sévère, mais quitte à proposer des sources autant que :
- elles soient à jour des version PHP (même si PHP4 est encore maintenu et développé, php5 a quand même de sérieux avantages, et bon sang, même free le propose pour ses pages perso !)
- elles soient réutilisables *facilement*, c'est à dire intégrables (sans modifications)

Voilà, désolé d'avoir encore fait le rabat-joie, mais je commence à être blasé...
neo2k2
Messages postés
126
Date d'inscription
jeudi 16 janvier 2003
Statut
Membre
Dernière intervention
9 novembre 2009
2 -
Bonjour à tous et merci pour vos critiques.

PUTCH>>> quand je dis "source débutante", je parle surtout de la source, pas de mon niveau en PHP ;o); pour la récursivité, j'y travaille mais mon but était de lister simplement un dossier et n sous-dossiers (le cas échéant) pas d'être exhaustif en profondeur, ceci dit pour améliorer le code je vais aller dans ce sens.

YOMAN64>>> oui, j'aurais dû extraire l'extension du fichier car dans mon exemple, j'ajoute à mon tableau .php3 (p.ex.) qui compte 4 caractères...
Euh, ma comparaison sur le nom du fichier n'est pas si dérangeante :oS Je vais également l'améliorer...
Pour la constance, oui, je suis allé trop vite dans mes quotes et c'est mélangé.
Je n'avais jamais utilisé glob mais il me semble que c'est limité à une utilisation locale donc je vais regarder comment cette fonction s'utilise et la rajouter si possible.

CODEFALSE>>> merci pour l'info, ma source est en fait à classer en PHP4 car nombreux l'utilisent encore. lol

Bon, si ça en vaut la peine, je vais mettre à jour mon code et reviendrai le publier ultérieurement.
codefalse
Messages postés
1127
Date d'inscription
mardi 8 janvier 2002
Statut
Modérateur
Dernière intervention
21 avril 2009
1 -
A savoir que Php5 implémente DirectoryIterator avec la spl (v5.2) qui te permet un parcours de dossier beaucoup plus simplement ! :)
cs_yoman64
Messages postés
592
Date d'inscription
samedi 19 janvier 2002
Statut
Membre
Dernière intervention
4 décembre 2008
-
Salut,

Je comprends pas cette ligne la : $ext=substr($subfolder,-3);

Parce qu'une extension de fichier peut faire plus, ou moin que 3 caractères...

Et ici: if (!in_array($file,$extensionListAccept)) {
Ça serait pas plutot l'extension à comparer, et non pas le nom du fichier complet ?

Dernièrement tu devrais être plus constant , des fois tu utilises des quotes,d'autre fois des doubles. De plus avec glob tu éviterais une boucle si tu veux juste compté le nombres d'éléments..

Sinon comme dit PUTCH c'est propre, alors je te souhaite moi aussi une bonne continuation :)
cs_putch
Messages postés
624
Date d'inscription
mardi 6 mai 2003
Statut
Membre
Dernière intervention
14 décembre 2009
1 -
salut !

bon pour une source débutante, c'est plutot bien codé.

Apres il serait intéressant que tu en fasses une fonction avec appel récursif notamment pour aller au dela du sous-dossier du répertoire que tu "scan".

Pour la précision "conforme XHTML 1.1", ..., je dirais juste heureusement :)

Bonne continuation
++