Lire le contenu d'un répertoire

 

Lire les entrées d'un répertoire

Le principe pour récupérer le contenu des fichiers/répertoires présents dans le répertoire est assez simple.

Il suffit tout d'abord de récupérer un handle qui va permettre de balayer l'arborescence de d'un répertoire via la fonction opendir()

#include <sys/types.h>
#include <dirent.h>
DIR *opendir (const char *name);

En entrée:

Un pointeur sur une chaine de caractères contenant le chemin absolu ou relatif vers le répertoire dont vous désireez un flux.

En sortie:

Handle sur le flux, ou 0 si problème. Dans ce cas, errno contient l'un des messages suivant:

Valeur Désignation
EACCESS Accès interdit.
EMFILE Trop de descripteurs de fichiers pour le processus en cours.
ENFILE Trop de fichiers ouverts simultanément sur le système.
ENOENT Le répertoire n'existe pas, ou name est une chaîne vide.
ENOMEM Pas assez de mémoire.
ENOTDIR name n'est pas un répertoire.

 

Maintenant que vous avez ouvert un flux, vous allez pouvoir lire séquentiellement les différents fichiers ou répertoires présents grâce à la fonction readdir(). Pour lire toutes les entrées d'un répertoire, il suffira d'appeler la fonction readdir pour chacune des entrées, tant que la fonction ne retourne pas NULL, c'est qu'il y a une autre entrée à traiter.

#include <sys/types.h>
#include <dirent.h>
struct dirent *readdir (DIR *dir);

En entrée:

un pointeur sur un handle de type DIR. Celui que l'on récupère après un opendir() !

 

En sortie:

Un pointeur sur une structure de type dirent. NULL si erreur (dans ce cas errno = EBADF pour "Descripteur de flux 'répertoire' invalide") ou fin de l'itération.

Image non trouvée !Vous utilisez un pointeur sur dirent ! Lors du prochain appel à readdir, les données qui étaient présentes juste avant cet appel seront écrasées.

Image non trouvée !Le seul champ portable dans cette structure se nomme d_name[]. Il pourra contenir au maximum NAME_MAX caractères et contiendra le nom d'un fichier ou d'un répertoire trouvé dans l'arborescence.

Image non trouvée !Cette fonction va retourner les entrées particulieres . et ..

 

Vous pourrez ensuite déterminer le type de l'entrée pour savoir si l'entrée est un fichier ou un répertoire, ...

 

Lorsque toutes les entrées (dont vous aviez besoin) sont lues, vous pouvez mettre fin à ce flux à partir de closedir()

#include <sys/types.h>
#include <dirent.h>

int closedir(DIR *dir);

En entrée:

dir qui est le handle obtenu via opendir().

En sortie:

0 si tout est ok, -1 sinon et errno = EBADF pour "Descripteur de flux 'répertoire' invalide"


Autres fonctions:

rewinddir() pour réinitialiser le flux au début (équivalent à faire un closedir suivi d'un opendir).

#include <sys/types.h>
#include <dirent.h>

void rewinddir(DIR *dir);

 

Ils existent d'autres fonctions, mais ne sont pas forcément portables...