Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

LISTER LES DOSSIERS, SOUS-DOSSIERS ET NOMBRE DE FICHIERS


Information sur la source

Catégorie :Fichier / Disque Classé sous : dossier, fichier, dossier fichier, liste dossiers, liste fichiers Niveau : Débutant Date de création : 31/03/2008 Date de mise à jour : 31/03/2008 14:30:49 Vu : 6 559

Note :
Aucune note

Commentaire sur cette source (17)
Ajouter un commentaire et/ou une note

Description

Cliquez pour voir la capture en taille normale
Une petite source sans prétention qui pourrait très bien figurer dans les snippets mais étant une page complète, je la poste ici.

Elle vient compléter ce qui a déjà été publié dans le sujet mais va un peu plus loin...

Elle est entièrement conforme aux normes XHTML 1.1 Strict (ce n'est pas très dur avec si peu de code).
 

Source

  • <?php
  • // repertoires/extensions à ignorer dans les dossiers
  • $foldersListIgnore = array ('.','..');
  • $extListAccept = array ('php','php3','php4','htm','html');
  • // recuperation des dossiers
  • $handle=opendir('.');
  • $tableau='';
  • $nbr_files=0;
  • // boucle sur les éléments du dossier
  • while ($file = readdir($handle))
  • {
  • // teste s'il s'agit d'un élément autorisé
  • if (!in_array($file,$foldersListIgnore)) {
  • // teste s'il s'agit d'un dossier
  • if (is_dir($file)) {
  • $subfolder=opendir($file);
  • $ext=substr($subfolder,-3);
  • // teste s'il y a des sous-dossiers et combien de sous-items il y a
  • while ($subfolderContents = readdir($subfolder))
  • {
  • // teste les fichiers du sous-dossiers et leur extension
  • if (!in_array($subfolderContents,$foldersListIgnore)) {
  • $listing[$subfolder]=$nbr_files;
  • }
  • $nbr_files++;
  • }
  • $nbr_files =($nbr_files-2);
  • // sous-résultat
  • $folderContents .= '<li>'.$k.'<a href="'.$file.'/">'.$file.'</a>&nbsp;('.$nbr_files.')</li>';
  • $nbr_files = 0;
  • }
  • // teste s'il s'agit d'un fichier
  • else if (is_file($file)) {
  • // extrait l'extension du fichier
  • $ext = substr($file,-4);
  • if (stristr($ext, '.') === FALSE) {
  • $ext = $ext;
  • }
  • else {
  • $ext = substr($ext,-3);
  • }
  • // vérifie si l'extension est autorisée dans le listing
  • if (in_array($ext,$extListAccept)) {
  • $file_name = $file;
  • // sous-résultat
  • $folderContents .= '<li>'.$k.'<a href="'.$file_name.'">'.$file_name.'</a></li>';
  • }
  • }
  • // teste s'il s'agit d'un fichier
  • else {
  • echo 'format de fichier non reconnu';
  • }
  • }
  • }
  • // ferme le parcours du dossier
  • closedir($handle);
  • // teste si la liste des dossiers n'est pas nulle
  • if (!isset($folderContents))
  • $folderContents = 'le dossier est vide';
  • ?>
  • <?xml version="1.0" encoding="iso-8859-1"?>
  • <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
  • <html lang="en" xml:lang="en">
  • <head>
  • <title><?php echo $_SERVER['PHP_SELF'];?></title>
  • <meta http-equiv="Content-Type" content="txt/html; charset=utf-8" />
  • </head>
  • <body>
  • <h2><?php echo $_SERVER['PHP_SELF'];?></h2>
  • <ul>
  • <?php echo $folderContents;?>
  • </ul>
  • </body>
  • </html>
<?php
// repertoires/extensions à ignorer dans les dossiers
$foldersListIgnore = array ('.','..');
$extListAccept = array ('php','php3','php4','htm','html');

// recuperation des dossiers
$handle=opendir('.');
$tableau='';
$nbr_files=0;

// boucle sur les éléments du dossier
while ($file = readdir($handle)) 
{
	// teste s'il s'agit d'un élément autorisé
	if (!in_array($file,$foldersListIgnore)) {
		// teste s'il s'agit d'un dossier
		if (is_dir($file)) {
			$subfolder=opendir($file);
			$ext=substr($subfolder,-3);
			// teste s'il y a des sous-dossiers et combien de sous-items il y a
			while ($subfolderContents = readdir($subfolder)) 
			{
				// teste les fichiers du sous-dossiers et leur extension
				if (!in_array($subfolderContents,$foldersListIgnore)) {
				$listing[$subfolder]=$nbr_files;
				}
				$nbr_files++;
			}
			$nbr_files =($nbr_files-2);
			// sous-résultat
			$folderContents .= '<li>'.$k.'<a href="'.$file.'/">'.$file.'</a>&nbsp;('.$nbr_files.')</li>';
			$nbr_files = 0;
		}
		// teste s'il s'agit d'un fichier
		else if (is_file($file)) {
			// extrait l'extension du fichier
			$ext = substr($file,-4);
			if (stristr($ext, '.') === FALSE) {
				$ext = $ext;
			}
			else {
				$ext = substr($ext,-3);
			}
			// vérifie si l'extension est autorisée dans le listing
			if (in_array($ext,$extListAccept)) {
				$file_name = $file;
				// sous-résultat
				$folderContents .= '<li>'.$k.'<a href="'.$file_name.'">'.$file_name.'</a></li>';
			}
		}
		// teste s'il s'agit d'un fichier
		else {
			echo 'format de fichier non reconnu';
		}
	}
}
// ferme le parcours du dossier
closedir($handle);

// teste si la liste des dossiers n'est pas nulle
if (!isset($folderContents))
	$folderContents = 'le dossier est vide';
?>
<?xml version="1.0" encoding="iso-8859-1"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html lang="en" xml:lang="en">
<head>
	<title><?php echo $_SERVER['PHP_SELF'];?></title>
	<meta http-equiv="Content-Type" content="txt/html; charset=utf-8" />
</head>
<body>
	<h2><?php echo $_SERVER['PHP_SELF'];?></h2>
	<ul>
		<?php echo $folderContents;?>
	</ul>
</body>
</html>

Conclusion

Je suis ouvert aux critiques constructives.
 

Historique

31 mars 2008 10:23:56 :
ajout d'une capture
31 mars 2008 14:30:49 :
- nettoyage du code: homogénéisation des quotes; - test sur l'extension du fichier en 3 ou 4 caractères.

Commentaires et avis

signaler à un administrateur
Commentaire de putch le 31/03/2008 11:29:15

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
++

signaler à un administrateur
Commentaire de yoman64 le 31/03/2008 11:42:43

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 :)

signaler à un administrateur
Commentaire de codefalse le 31/03/2008 13:31:04 administrateur CS

A savoir que Php5 implémente DirectoryIterator avec la spl (v5.2) qui te permet un parcours de dossier beaucoup plus simplement ! :)

signaler à un administrateur
Commentaire de neo2k2 le 31/03/2008 13:45:57

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.

signaler à un administrateur
Commentaire de neigedhiver le 31/03/2008 21:40:40

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é...

signaler à un administrateur
Commentaire de Morphinof le 03/04/2008 12:23:00

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 :)

signaler à un administrateur
Commentaire de neo2k2 le 03/04/2008 13:25:16

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.

signaler à un administrateur
Commentaire de codefalse le 03/04/2008 13:35:13 administrateur CS

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é ? :)

signaler à un administrateur
Commentaire de neo2k2 le 03/04/2008 15:39:37

J'y travaille... Faut que je me remette à la poo... ;o)

signaler à un administrateur
Commentaire de codefalse le 03/04/2008 16:50:20 administrateur CS

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/

signaler à un administrateur
Commentaire de neigedhiver le 03/04/2008 17:06:53

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.

signaler à un administrateur
Commentaire de Morphinof le 03/04/2008 19:44:56

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 :)

signaler à un administrateur
Commentaire de neo2k2 le 04/04/2008 09:52:23

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!

signaler à un administrateur
Commentaire de malalam le 04/04/2008 23:42:09 administrateur CS

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.

signaler à un administrateur
Commentaire de codefalse le 04/04/2008 23:53:01 administrateur CS

Je savais que parler de SPL allait te faire plaisir Malalam ;)

signaler à un administrateur
Commentaire de Morphinof le 05/04/2008 01:45:10

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 ;)

signaler à un administrateur
Commentaire de mahlaoui le 07/04/2008 16:16:16

Merci

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

nombre de fichier dans un dossier [ par lan0sic ] Bonjours,Yatil un moyen de savoir combien il y a de fichier dans un dossier sur un ftp ?Merci bcp!Bonne prog... Lanosic lien vers fichier hors du dossier serveur [ par ticapix ] BonjourJe cherche a creer un lien vers un fichier qui ce trouve dans le dossier parent du serveur.Je pense qu'il y a peut etre une option dans apache. Copie de fichier [ par BirD ] Hello, j'ai un ptit prob pour copier une image, je m'explique: j'arrive parfaitement à copier l'image, mais dans le même dossier, ou un sous dossier, création de fichier [ par TRASH52 ] TRASH52bon je cherche à créer un arborescence de fichier deja enregistrés dans deux fi Time out [ par ekinoks ] Salut !alors voila j'est un petit problemme. pour ne pas avoir de time out je pencé que de se conecté et se deconecté plusiseur foi sur des duré de mo caddie virtuel avec des sessions... [ par roul ] Bon, j'explique mon probleme, je débute en php et là je vais m'arracher les cheveux sur un truc qui à l'air tout simple, mais là j'en peux plus; alors Lister les fichier et dossier [ par supergrey ] Bonjour, je voudrais savoir comment lister tous les dossiers et fichiers sur un autre serveur. [ PHP ] [ Création de dossier et fichier ] [ UNIX ] [ par vvoisin ] Bonjour, J'ai un probléme avec mkdir(). Quand j'execute le code suivant sur mon pc sous easyphp, le repertoire est bien créé alors que sur mon serveur Upload de fichier ... [ par Hector78 ] Hello !Je cherche à uploader un fichier local et l'envoyer dans un dossier sur un serveur. J'ai trouvé un code, très intéressant à l'adresse suivante préchargement d'images [ par putch ] voial j'ai un souci avec une fonction que je souhaite réaliser.Celle-ci doit précharger dans le navigateur toutes les images d'un répertoire.function


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,702 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.