Accès rapide :
Entête à inclure
Types définis dans <dirent.h>
Fonctions définies dans <dirent.h>
Exemple de code
Conformité
Sujets connexes
<dirent.h> n'appartient pas au standard ISO du langage C. Il est défini par POSIX et sera donc naturellement disponible sur les systèmes Unix, Linux et macOS. Sous Windows, sa disponibilité dépendra de l'environnement utilisé.
L'entête <dirent.h> permet de parcourir le contenu d'un dossier. Le principe est toujours le même : on ouvre un flux de dossier avec opendir, on lit les entrées avec readdir, puis on libère la ressource avec closedir.
Il ne faut pas confondre ce flux de dossier avec un flux FILE * issu de fopen. Un dossier n'est pas lu comme un fichier texte : POSIX fournit une API dédiée afin de masquer le format interne utilisé par le système de fichiers.
#include <dirent.h>
| Type | Description |
|---|---|
DIR |
Type opaque représentant un flux de dossier ouvert. |
ino_t |
Type représentant le numéro de série d'un fichier dans le système de fichiers. |
struct dirent |
Structure décrivant une entrée renvoyée lors du parcours d'un dossier. |
| Fonction | Description |
|---|---|
alphasort |
Fonction de comparaison utilisable avec scandir pour trier les noms alphabétiquement. |
closedir |
Ferme un flux de dossier précédemment ouvert. |
dirfd |
Récupère le descripteur de fichier associé à un flux de dossier. |
fdopendir |
Construit un flux de dossier à partir d'un descripteur déjà ouvert. |
opendir |
Ouvre un dossier et renvoie un flux de dossier. |
readdir |
Lit l'entrée suivante dans un flux de dossier. |
readdir_r |
Ancienne variante réentrante de readdir. Son usage est délicat : préférez readdir dans du code moderne. |
rewinddir |
Replace le flux de dossier au début. |
scandir |
Charge les entrées d'un dossier dans un tableau, avec filtrage et tri optionnels. |
seekdir |
Replace un flux de dossier sur une position obtenue avec telldir. |
telldir |
Renvoie la position courante dans un flux de dossier. |
seekdir et telldir sont associées à l'option XSI. Elles restent très classiques sur les systèmes Unix courants, mais sont moins souvent nécessaires que le triplet opendir, readdir, closedir.
Le programme suivant affiche le contenu du dossier courant. On positionne errno à 0 avant la boucle afin de pouvoir distinguer une fin normale de dossier d'une erreur de lecture.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
#define _POSIX_C_SOURCE 200809L #include <dirent.h> #include <errno.h> #include <stdio.h> #include <stdlib.h> int main(void) { DIR * directory = opendir("."); if (directory == NULL) { perror("opendir"); return EXIT_FAILURE; } errno = 0; struct dirent * entry; while ((entry = readdir(directory)) != NULL) { puts(entry->d_name); } if (errno != 0) { perror("readdir"); closedir(directory); return EXIT_FAILURE; } if (closedir(directory) == -1) { perror("closedir"); return EXIT_FAILURE; } return EXIT_SUCCESS; } |
Une exécution possible de ce programme produit la sortie suivante.
$> gcc -o sample sample.c $> ./sample . .. sample.c sample $>
L'entête <dirent.h> est défini par POSIX. La référence utilisée ici est la documentation POSIX.1-2017 publiée par The Open Group :
<dirent.h>.
Améliorations / Corrections
Vous avez des améliorations (ou des corrections) à proposer pour ce document : je vous remerçie par avance de m'en faire part, cela m'aide à améliorer le site.
Emplacement :
Description des améliorations :