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