PHP offre un ensemble de fonctions pour gérer les dossiers sur le disque du serveur (ou un disque accessible depuis le serveur).

Certaines opérations ne sont cependant pas possibles directement et nous devons les prendre en charge avec le développement de nos propres fonctions de gestion qui utilisent très souvent des mécanismes récursifs.

Pour les exemples, nous utiliserons l'aborescence de dossiers ci-contre.

Cet aborescence se trouve dans le dossier test du tutoriel. Vous pouvez voir son contenu avec le bouton dans la barre de menu du tutoriel.

Si vous ne voyez pas cet aborescence, ou si vous voulez la ré-initialiser utilisez ce script.

Contenu d'un dossier

Pour lire le contenu d'un dossier, nous procédons comme pour la lecture d'un fichier ligne à ligne et nous devons exécuter les opérations suivantes :

L'exemple suivant affiche le contenu du dossier test_repert.

Exemple : contenu d'un dossier

La boucle de lecture du contenu du dossier est du même genre que celle utilisée pour lire les résultats d'une requête SELECT :

while ($elem = readdir($dossier)) {
	...
}

L'affichage des résultats du script nous permet de remarquer trois choses :

Modifions le script pour ne pas afficher (et éventuellement traiter) les dossiers particuliers . et ..

Exemple : contenu d'un dossier

Boucle de lecture

La boucle while ($elem = @readdir($dossier)) doit être améliorée car elle ne fonctionne pas correctement dans tous les cas.

En effet, si un élément (fichier ou sous-dossier) s'appelle 0 ou false, la boucle s'arrêtera car elle croiera que c'est le résultat de la fonction readdir() et pas le nom de l'élément.

Regardons ce qui se passe si nous essayons de lire le contenu du dossier test_repert/export qui contient un dossier appelé 0.

Exemple : contenu d'un dossier

La boucle while ($elem = @readdir($dossier)) ne fonctionne pas, et s'arrête dés qu'elle rencontre le dossier appelé 0.
Nous devons utiliser l'opérateur d'inégalité stricte !== et la syntaxe suivante pour tester la fin de la boucle :
while (($elem = @readdir($dossier)) !== FALSE)

Exemple : contenu d'un dossier