Dans ce tutoriel, je vais vous apprendre à lister les fichiers qui sont contenus dans un dossier. Par exemple, si vous avez un script pour uploader des fichiers, vous aurez sûrement envie de pouvoir les lister pour les retrouver sans passer par votre FTP.
Nous allons donc voir ça ensemble ! ;)
Pour les prérequis, il faut au moins que vous sachiez utiliser les conditions et les boucles, c'est tout ce qu'il vous faut pour réaliser ce petit script.
Pour commencer, nous allons ici poser les bases (simples) de ce que nous allons faire pour lister le contenu d'un dossier.
Pour faire simple, nous allons nous servir de deux fonctions que vous ne connaissez peut-être pas. Ce sont opendir() et readdir().
Si vous avez ne serait-ce que quelques bases d'anglais, vous aurez sans doute reconnu open qui signifie ouvrir, et read qui signifie lire. Pour dir, c'est une abréviation de directory, qui signifie dossier.
Je vais vous expliquer leur fonctionnement :
opendir() : cette fonction sert à ouvrir un dossier. Elle prend comme paramètre le nom du dossier qui doit être ouvert, celui justement dont on va lire le contenu ! ;)
readdir() : cette fonction va s'utiliser après la fonction opendir(). Elle permet de lire le contenu du dossier précédemment ouvert.
Et c'est tout... :D
Ce n'est pas plus dur ! Bien sûr, il ne suffit pas de poser les deux fonctions l'une après l'autre, vous vous en doutez bien.
Comme il y a sûrement plusieurs fichiers dans votre dossier, il faudra utiliser une boucle... Nous allons faire tout cela dans la prochaine partie ! :)
Et puis, pour le plaisir (chacun son point de vue sur le plaisir :p ), nous allons faire un compteur qui va compter le nombre de fichiers contenus dans votre dossier.
Nous voilà dans la partie pratique de ce tutoriel. Nous allons avoir, au terme de ce chapitre, une page qui liste le contenu du dossier souhaité ! ;)
Comme je vous l'ai annoncé dans la première partie, nous allons utiliser un compteur qui va nous donner le nombre de fichiers présents dans le dossier. Pour faire cela, nous allons simplement créer une variable $nb_fichier que l'on incrémentera à chaque nouveau fichier.
Nous allons donc déclarer cette variable. Les résultats seront affichés sous forme de liste. On va ouvrir notre balise <ul> ici :
<?php
$nb_fichier = 0;
echo '<ul>';
?>
Rien de compliqué jusque-là.
Maintenant, il va falloir ouvrir le dossier souhaité avec la fonction opendir() que je vous ai décrite dans la première partie. On stockera le résultat de l'ouverture du dossier dans une variable $dossier, vous verrez ensuite pourquoi. ;)
<?php
if($dossier = opendir('./mondossier'))
{
?>
Pourquoi avoir ouvert un if ? :o
Bonne question ! Quand j'ouvre le dossier avec opendir, je donne en paramètre le lien relatif (M@teo21 traite des liens relatifs dans son cours xHTML/CSS : ici). Si jamais le dossier en question n'existe pas, il ne sera pas ouvert, et par conséquent le script plantera ! Pour éviter cela, on met une condition. Si elle est vérifiée, on continue l'exécution du script, sinon on affiche un message d'erreur.
Maintenant que cette question ne vous trotte plus dans la tête, nous allons continuer. :)
Nous allons lire les fichiers avec la fonction readdir() et commencer notre boucle.
Comme je vous l'ai dit plus haut, nous avons créé une variable $dossier qui contient le résultat de l'ouverture. C'est cette variable qui va être lue avec readdir().
Ici, nous indiquons les fichiers à ne pas afficher dans les résultats. Je m'explique.
Si nous prenons l'exemple de la liste d'un dossier qui contient des images, cela ferait un peu « tache » de voir apparaître un index.php en plein milieu de notre liste... :( Pour cette raison, nous mettons une condition qui dit : « Si ce n'est ni '.', ni '..', ni 'index.php', affiche les fichiers... ».
Maintenant, on affiche les résultats !
<?php
$nb_fichier++; // On incrémente le compteur de 1
echo '<li><a href="./mondossier/' . $fichier . '">' . $fichier . '</a></li>';
} // On ferme le if (qui permet de ne pas afficher index.php, etc.)
} // On termine la boucle
?>
Le code est explicite, on incrémente le compteur. Puis on crée une nouvelle entrée dans la liste avec le nom du fichier en lien. Comme ça, on ouvre le fichier (par exemple une image) directement en cliquant dessus. :)
Maintenant, il ne nous reste plus qu'à afficher le nombre de fichiers, le message d'erreur au cas où le dossier n'aurait pas été ouvert et la fermeture de la liste.
Ah ! Au fait, quand on ouvre un dossier, il faut aussi le fermer (comme la connexion à MySQL) : donc nous allons utiliser closedir() pour le fermer à la fin du script !
Au travail ! ;)
<?php
echo '</ul><br />';
echo 'Il y a <strong>' . $nb_fichier .'</strong> fichier(s) dans le dossier';
closedir($dossier);
}
else
echo 'Le dossier n\' a pas pu être ouvert';
?>
Pour les idées d'améliorations, voici ce que vous pourriez faire ! ;)
Un petit design : sans CSS, ça ne casse pas trois pattes... :p
Un sélecteur de dossiers avec un formulaire : effectivement, ce code ne permet que de lister le contenu du dossier que vous avez indiqué en paramètre à opendir() ; avec une variable $_GET dans l'adresse, vous pourriez faire varier le paramètre de opendir() (sécuriser votre variable, on ne sait jamais ;) ).
Ajouter une distinction entre fichiers et dossiers avec la fonction is_dir().
Mettre le tout dans une seule fonction. Faire une fonction lire_dossier() qui prend en paramètre le chemin relatif du dossier que vous voulez lire. Cette fonction contiendra le script que vous devrez adapter en conséquence, et en retournera la liste des fichiers.
Tout ce que votre esprit créatif vous indique de faire ! Essayez, testez, faites des expérimentations (plus ou moins louches :D ) et voyez ce que ça donne, c'est comme cela qu'on progresse ! ;)
Voilà pour les idées que j'ai, si vous en avez d'autres à proposer, n'hésitez pas ! :)
Bon travail ! ;)
Voilà, ce tutoriel touche à sa fin. J'espère qu'il vous aura rendu service.