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 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
| typedef enum
{
DIR_FILE, /* Affiche ou traite que les fichiers. */
DIR_DIRECTORY, /* Affiche ou traite que les repertoires. */
DIR_BOTH, /* Affiche ou traite les repertoires et les fichiers. */
DIR_NB_TYPE
}
e_dir_type;
/* --------------------------------------------------------------------------
dir_browse
--------------------------------------------------------------------------
Parcours le repertoire passe en parametre.
--------------------------------------------------------------------------
E: Repertoire a parcourir.
E: Type de parcours :
- DIR_FILE : Ne traite que les fichiers,
- DIR_DIRECTORY : Ne traite que les repertoires,
- DIR_BOTH : Traite les deux.
E: Fonction de traitements definie par l'utilisateur.
S: 0 = OK, -1 = Erreur.
-------------------------------------------------------------------------- */
int dir_browse (const char * s_dir_path,
const e_dir_type e_type,
void (* action_func)(const struct stat * st_status,
const char * s_name))
{
int err = 0;
char tmp_str [512];
DIR * dir = NULL;
struct dirent * st_dir = NULL;
struct stat st_status;
/* ----- Test de la validite des arguments ----- */
if (s_dir_path == NULL)
{
/* Erreur: Argument NULL. */
err = -1;
}
else if (action_func == NULL)
{
/* Erreur: Pointeur sur la fonction 'action_fun' de valeur NULL. */
err = -1;
}
/* ----- */
/* ----- Ouverture du repertoire ----- */
dir = opendir (s_dir_path);
if (dir == NULL)
{
/* Erreur d'ouverture du repertoire.
On quitte la fonction avec un code d'erreur. */
err = -1;
}
/* ----- */
/* ----- Parcours et traitements ----- */
if (err == 0)
{
while ((st_dir = readdir (dir)) != NULL)
{
sprintf (tmp_str, "%s%s", s_dir_path, st_dir->d_name);
/* Recuperation des informations sur le fichier en cours. */
if (stat (tmp_str, & st_status) == 0)
{
switch (e_type)
{
/* Action sur les repertoires uniquement. */
case DIR_DIRECTORY :
{
if (S_ISDIR (st_status.st_mode))
{
action_func (& st_status, st_dir->d_name);
}
}
break;
/* Action sur les fichiers uniquement. */
case DIR_FILE :
{
if (S_ISLNK (st_status.st_mode) || S_ISREG (st_status.st_mode))
{
action_func (& st_status, st_dir->d_name);
}
}
break;
/* Action sur les fichiers et les repertoires. */
default :
action_func (& st_status, st_dir->d_name);
}
}
}
}
/* ----- */
/* ----- Terminaison de la fonction ----- */
/* Fermeture du repertoire. */
closedir (dir);
/* ----- */
return err;
} |
Partager