Les fonctions de la famille
fts
servent à traverser des hiérarchies de fichiers.
Rapidement, disons que la fonction
fts_open()
renvoie une sorte de descripteur de la hiérarchie de fichiers,
que l'on fourni ensuite aux autres fonctions de la famille
fts.
La fonction
fts_read()
renvoie un pointeur sur une structure
décrivant l'un des fichiers de l'arborescence.
La fonction
fts_children()
renvoie un pointeur sur une liste chaînée de structures, chacune décrivant
l'un des fichiers contenu dans le répertoire de la hiérarchie.
En général, les répertoires sont visités à deux reprises, distinctes.
Un passage en ordre
pre-order
avant d'avoir parcouru leurs descendants, et un passage en ordre
post-order
après avoir visité tous les sous-répertoires.
Les fichiers ne sont examinés qu'une seule fois.
Il est possible de parcourir la hiérarchie « logiquement »
(en ignorant les liens symboliques) ou « physiquement »
(en visitant les liens symboliques).
On peut ordonner le parcours de la hiérarchie,
ignorer ou visiter plusieurs fois certaines parties.
Deux structures sont définies (par typedef) dans le fichier d'entête
<fts.h>.
La première est
FTS,
une structure représentant l'arborescence des fichiers elle-même,
et la seconde est
FTSENT,
une structure représentant un fichier dans la hiérarchie.
Normalement, une structure
FTSENT
est renvoyée pour chaque fichier rencontré dans la hiérarchie.
Dans cette page de manuel, les termes « fichier » et structure
FTSENT
sont généralement interchangeables.
La structure
FTSENT
contient au moins les champs suivants, décrits en détail plus bas :
typedef struct _ftsent {
unsigned short fts_info; /* flags for FTSENT structure */
char *fts_accpath; /* access path */
char *fts_path; /* root path */
short fts_pathlen; /* strlen(fts_path) */
char *fts_name; /* filename */
short fts_namelen; /* strlen(fts_name) */
short fts_level; /* depth (-1 to N) */
int fts_errno; /* file errno */
long fts_number; /* local numeric value */
void *fts_pointer; /* local address value */
struct ftsent *fts_parent; /* parent directory */
struct ftsent *fts_link; /* next file structure */
struct ftsent *fts_cycle; /* cycle structure */
struct stat *fts_statp; /* stat(2) information */
} FTSENT;
Les membres ont les significations suivantes :
- fts_info
-
L'un des attribut suivants, décrivant la structure
FTSENT
et le fichier qu'elle représente.
Toutes ces entrées sont terminales
(sauf les répertoires ne présentant pas d'erreur
FTS_D),
ce qui signifie qu'elle ne seront visitées
qu'une seule fois, et que leur éventuels descendants
(cas des répertoires en erreur) ne seront pas visités.
-
- FTS_D
-
Un répertoire visité en phase pré-order.
- FTS_DC
-
Un répertoire introduisant une boucle dans l'arborescence.
(Le champ
fts_cycle
de la structure
FTSENT
sera également rempli).
- FTS_DEFAULT
-
Toute structure
FTSENT
représentant un type de fichier non décrit explicitement
par l'une des autres valeurs de
fts_info.
- FTS_DNR
-
Un répertoire ne pouvant être lu.
Ceci est considéré comme une erreur, et le champ
fts_errno
sera rempli avec une valeur décrivant sa cause.
- FTS_DOT
-
Un fichier nommé « . » ou « .. »
qui n'a pas été indiqué explicitement comme argument de
fts_open()
(voir
FTS_SEEDOT).
- FTS_DP
-
Un répertoire visité en phase post-order.
Le contenu de la structure
FTSENT
ne sera pas différent de ce qu'il était durant la phase pré-order.
C'est-à-dire quand le champ
fts_info
valait
FTS_D.
- FTS_ERR
-
Il s'agit d'un retour d'erreur, le champ
fts_errno
étant rempli pour indiquer la cause de l'erreur.
- FTS_F
-
Fichier normal.
- FTS_NS
-
Un fichier pour lequel aucune information provenant de
stat(2)
n'est disponible.
Le contenu du champ
fts_statp
est indéfini.
Il s'agit d'un cas d'erreur dont la cause est indiquée dans
fts_errno.
- FTS_NSOK
-
Un fichier pour lequel aucune information provenant de
stat(2)
n'a été demandée.
Le contenu du champ
fts_statp
est indéfini.
- FTS_SL
-
Un lien symbolique.
- FTS_SLNONE
-
Un lien symbolique pointant dans le vide.
Le contenu du champ
fts_statp
contient les caractéristiques du lien lui-même.
- fts_accpath
-
Un chemin permettant d'accéder au fichier depuis le répertoire courant.
- fts_path
-
Le chemin d'accès au fichier à partir du point de départ du parcours.
Il contient en préfixe le chemin fourni lors de l'invocation de
fts_open().
- fts_pathlen
-
La longueur de la chaîne pointée par
fts_path.
- fts_name
-
Le nom du fichier.
- fts_namelen
-
La longueur de la chaîne pointée par
fts_name.
- fts_level
-
La profondeur où le fichier a été trouvé dans l'arborescence,
numérotée de -1 à N.
La structure
FTSENT
représentant le parent du point de départ est numérotée -1.
La structure
FTSENT
représentant la racine de départ elle-même est numérotée 0.
- fts_errno
-
Dans une structure
FTSENT
renvoyée par un appel
fts_children()
ou
fts_read(),
dont le champ
fts_info
contient
FTS_DNR,
FTS_ERR
ou
FTS_NS,
le champ
fts_errno
est rempli avec la valeur de la variable externe
errno
indiquant la cause de l'erreur.
Dans les autres cas, le contenu du champ
fts_errno
est indéfini.
- fts_number
-
Ce champ est mis à la disposition des programmes applicatifs,
et n'est modifié par aucune fonction de la famille
fts.
Il est toutefois initialisé à zéro.
- fts_pointer
-
Ce champ est mis à la disposition des programmes applicatifs,
et n'est modifié par aucune fonction de la famille
fts.
Il est toutefois initialisé à NULL.
- fts_parent
-
Un pointeur sur la structure
FTSENT
référençant le fichier dans la hiérarchie imédiatement au dessus
du fichier en cours, c'est-à-dire le répertoire auquel il appartient.
Une structure
fts_parent
pour le point d'entrée initial est également fournie,
mais seuls ses membres
fts_level,
fts_number
et
fts_pointer
sont garantis d'être initialisés.
- fts_link
-
Au retour de la fonction
fts_children(),
le champ
fts_link
pointe sur la structure suivante dans la liste chaînée des membres
du répertoire, liste terminée par un NULL.
Dans les autres situations, le contenu du champ
fts_link
est indéterminé.
- fts_cycle
-
Si un répertoire introduit une boucle dans la hiérarchie (voir
FTS_DC),
soit à cause d'un lien physique entre deux répertoires, soit à cause
d'un lien symbolique pointant vers un répertoire, le champ
fts_cycle
pointera vers la structure
FTSENT
de la hiérarchie qui référence le même fichier que celui représenté
par la structure
FTSENT.
Sinon, le contenu du champ
fts_cycle
est indéfini.
- fts_statp
-
Un pointeur vers les informations fournies par
stat(2)
pour le fichier.
Un tampon unique est utilisé pour tous les chemins d'accès
de tous les fichiers de la hiérarchie.
Ainsi, les champs
fts_path
et
fts_accpath
ne sont assurés d'être terminés par un octet nul
que
pour le dernier fichier renvoyé par
fts_read().
L'utilisation de ces champs pour référencer tout fichier représenté
par d'autres structures
FTSENT
nécessitera que le tampon du chemin soit modifié avec les informations
contenues dans le champ
fts_pathlen
de cette structure
FTSENT.
De telles modifications doivent être annulées avant des appels ultérieurs à
fts_read()
ne soient tentés.
Le champ
fts_name
est toujour terminé par un octet nul.