glob(), la fonction de sélection de pathnames
Description
glob() est une fonction bibliothèque permettant de constituer une liste de noms de fichiers correspondant à une expression de sélection du même type que les expressions du shell. Elle peut être utilisée quand un programme a besoin d’interpréter lui-même les expressions de sélection de fichiers (au sens large).
Elle est disponible dans les fonctions fournies avec le compilateur C.
Principe de fonctionnement
1. Généralités
La fonction glob() recherche les fichiers dont le nom long correspond à une expression donnée. L’expression en question n’est pas une expression régulière au sens où on l’entend lorsqu’on parle d’expression régulière basique ou étendue. Il s’agit là d’expression de sélection de noms de fichiers identiques à celles que l’on trouve dans les shells, et qui permettent de générer une liste de noms de fichiers (afin de les passer à un programme dans le cas du shell).
Un exemple d’utilisation possible de cette fonction est l’interprétation distante d’une expression de sélection, passée d’un programme client à un programme serveur via une connexion réseau.
Les informations de référence données ci-dessous sont extraites du manuel du programmeur Linux.
2. Utilisation
Lorsque l’on souhaite utiliser la fonction glob() dans un programme C, il faut inclure, avant l’utilisation de la fonction, le fichier glob.h qui contient des définitions et déclarations nécessaires à la fonction.
Syntaxe
#include <glob.h>
Il faut ensuite définir les variables qui seront utilisées par la fonction. Leur type sera défini grâce au prototype de glob() suivant, tel que spécifié par la page de manuel :
int glob(const char *pattern, int flags,
int (*errfunc) (const char *epath, int eerrno),
glob_t *pglob);
Les paramètres passés à glob() ont l’usage suivant :
-
pattern : expression de sélection de nom de fichier, utilisant la syntaxe du shell.
-
flags : indicateurs binaires destinés à modifier le comportement...
Exercices
1. Exercice 1
Comment récupérer et afficher la liste des fichiers du répertoire courant se terminant par l’extension .txt ?
L’expression à utiliser est *.txt.
Solution
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <glob.h>
int main()
{
int _i;
glob_t _globbuf;
char *_regexp = "*.txt";
_globbuf.gl_offs = 0;
switch (glob(_regexp, 0, NULL, &_globbuf)) {
case GLOB_NOSPACE:
fprintf(stderr, "Pas assez de memoire !\n");
break;
case GLOB_ABORTED:
fprintf(stderr, "Erreur de lecture !\n");
break;
case GLOB_NOMATCH:
fprintf(stderr, "Pas de correspondance.\n");
break;
default:
for (_i = 0; _globbuf.gl_pathv[_i] != NULL; _i++) {
printf("%5d %s\n", _i, _globbuf.gl_pathv[_i]);
}
break;
}
return 0;
}
L’exécution de ce programme dans un répertoire contenant les fichiers texte f1.txt, f2.txt et f3.txt produira le résultat suivant :
0 f1.txt
1 f2.txt
2 f3.txt
Aucun argument n’est passé à ce programme via la ligne de commande. L’expression de sélection est codée dans le programme sous forme d’une chaîne de caractères pointée par la variable...