Participer au site avec un Tip
Rechercher
 

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 :

Vous êtes un professionnel et vous avez besoin d'une formation ? Programmation avec
Le langage C
Voir le programme détaillé

La librairie <dirent.h> (POSIX)

Accès rapide :
Entête à inclure
Types définis dans <dirent.h>
Fonctions définies dans <dirent.h>
Exemple de code
Conformité
Sujets connexes

L'entête <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.

Entête à inclure

#include <dirent.h>

Types définis dans <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.

Fonctions définies dans <dirent.h>

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.
Dans POSIX.1-2017, 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.

Exemple de code

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;
}
Parcours simple d'un dossier

Une exécution possible de ce programme produit la sortie suivante.

$> gcc -o sample sample.c
$> ./sample
.
..
sample.c
sample
$>

Conformité

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

Sujets connexes

alphasort
closedir
dirfd
DIR *
fdopendir
ino_t
opendir
readdir
readdir_r
rewinddir
scandir
seekdir
struct dirent
telldir


Vous êtes un professionnel et vous avez besoin d'une formation ? Programmation avec
Le langage C
Voir le programme détaillé