fts(3) Library Functions Manual fts(3) NOM fts, fts_open, fts_read, fts_children, fts_set, fts_close - Parcourir une hierarchie de fichiers BIBLIOTHEQUE Bibliotheque C standard (libc, -lc) SYNOPSIS #include #include #include FTS *fts_open(char *const *path_argv, int options, int (*_Nullable compar)(const FTSENT **, const FTSENT **)); FTSENT *fts_read(FTS *ftsp); FTSENT *fts_children(FTS *ftsp, int instr); int fts_set(FTS *ftsp, FTSENT *f, int instr); int fts_close(FTS *ftsp); DESCRIPTION Les fonctions de la famille fts servent a traverser des hierarchies de fichiers. Disons rapidement que la fonction fts_open() renvoie un descripteur (<< handler >> -- de type FTS *) qui fait reference a un << flux >> de hierarchie de fichiers. Ce descripteur est ensuite fourni aux autres fonctions de la famille fts. La fonction fts_read() renvoie un pointeur sur une structure decrivant l'un des fichiers de l'arborescence. La fonction fts_children() renvoie un pointeur sur une liste chainee de structures, chacune decrivant l'un des fichiers contenu dans un repertoire de la hierarchie. En general, les repertoires sont visites a deux reprises distinctes. Un passage en ordre << preorder >> (avant d'avoir parcouru leurs descendants) et un passage en ordre << postorder >> (apres avoir visite tous les sous-repertoires). Les fichiers ne sont examines qu'une seule fois. Il est possible de parcourir la hierarchie << logiquement >> (en visitant les fichiers pointes par les liens symboliques) ou << physiquement >> (en visitant les liens symboliques eux-memes). On peut ordonner le parcours de la hierarchie, ignorer ou visiter plusieurs fois certaines parties. Deux structures (et les types associes) sont definies dans le fichier include . Le premier type est FTS, une structure representant l'arborescence des fichiers elle-meme. Le second est FTSENT, la structure representant un fichier dans la hierarchie. Normalement, une structure FTSENT est renvoyee pour chaque fichier rencontre dans la hierarchie. Dans cette page de manuel, les termes << fichier >> et << structure FTSENT >> sont generalement interchangeables. La structure FTSENT contient les champs decrivant un ficher. La structure contient au moins les champs suivants (il y a des champs supplementaires qui doivent etre consideres comme reserves a l'implementation). typedef struct _ftsent { unsigned short fts_info; /* attribut de la structure FTSENT */ char *fts_accpath; /* chemin d'acces */ char *fts_path; /* chemin de la racine */ short fts_pathlen; /* strlen(fts_path) + strlen(fts_name) */ char *fts_name; /* nom du fichier */ short fts_namelen; /* strlen(fts_name) */ short fts_level; /* profondeur (-1 a N) */ int fts_errno; /* fichier errno */ long fts_number; /* valeur numerique locale */ void *fts_pointer; /* valeur de l'adresse locale */ struct ftsent *fts_parent; /* repertoire parent */ struct ftsent *fts_link; /* fichier de structure suivant */ struct ftsent *fts_cycle; /* structure de boucle */ struct stat *fts_statp; /* information [l]stat(2) */ } FTSENT; Les membres ont les significations suivantes : fts_info L'un des attributs suivants, decrivant la structure FTSENT renvoyee et le fichier qu'elle represente. A l'exception des repertoires FTS_D ne presentant pas d'erreur, toutes ces entrees sont terminales, ce qui signifie qu'elles ne seront visitees qu'une seule fois et que leur eventuels descendants (des repertoires en erreur) ne seront pas visites. FTS_D Un repertoire visite en phase << preorder >>. FTS_DC Un repertoire introduisant une boucle dans l'arborescence. Le champ fts_cycle de la structure FTSENT sera egalement rempli. FTS_DEFAULT Toute structure FTSENT representant un type de fichier non decrit explicitement par l'une des autres valeurs de fts_info. FTS_DNR Un repertoire ne pouvant etre lu. C'est considere comme une erreur, et le champ fts_errno sera defini pour indiquer la cause de l'erreur. FTS_DOT Un fichier nomme << . >> ou << .. >> qui n'a pas ete indique explicitement comme argument de fts_open() (consultez FTS_SEEDOT). FTS_DP Un repertoire visite en phase << postorder >>. Le contenu de la structure FTSENT ne sera pas different de ce qu'il etait apres la phase << preorder >>. C'est-a-dire quand le champ fts_info valait FTS_D. FTS_ERR Il s'agit d'un retour d'erreur, le champ fts_errno etant rempli pour indiquer la cause de l'erreur. FTS_F Un fichier normal. FTS_NS A file for which no [l] stat(2) information was available. The contents of the fts_statp field are undefined. This is an error return, and the fts_errno field will be set to indicate what caused the error. FTS_NSOK A file for which no [l] stat(2) information was requested. The contents of the fts_statp field are undefined. FTS_SL Un lien symbolique. FTS_SLNONE Un lien symbolique pointant dans le vide. Le contenu du champ fts_statp contient les informations caracteristiques de fichier du lien lui-meme. fts_accpath Un chemin permettant d'acceder au fichier depuis le repertoire courant. fts_path Le chemin d'acces au fichier a partir du point de depart du parcours. Il contient en prefixe le chemin fourni lors de l'invocation de fts_open(). fts_pathlen La somme des longueurs des chaines pointees par fts_path et fts_name. fts_name Le nom du fichier. fts_namelen La longueur de la chaine pointee par fts_name. fts_level La profondeur ou le fichier a ete trouve dans l'arborescence, numerotee de -1 a N. La structure FTSENT representant le parent du point de depart (ou racine) est numerotee -1. La structure FTSENT representant la racine de depart elle-meme est numerotee 0. fts_errno Dans une structure FTSENT renvoyee 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 le numero d'erreur (c'est-a-dire, la valeur de errno) indiquant la cause de l'erreur. Dans les autres cas, le contenu du champ fts_errno est indefini. fts_number Ce champ est mis a la disposition des programmes applicatifs et n'est modifie par aucune fonction de la famille fts. Il est initialise a 0. fts_pointer Ce champ est mis a la disposition des programmes applicatifs et n'est modifie par aucune fonction de la famille fts. Il est toutefois initialise a NULL. fts_parent Un pointeur sur la structure FTSENT referencant le fichier dans la hierarchie immediatement au dessus du fichier en cours, c'est-a-dire le repertoire auquel il appartient. Une structure parente pour le point d'entree initial est egalement fournie, mais seuls ses membres fts_level, fts_number et fts_pointer sont garantis d'etre initialises. fts_link Au retour de la fonction fts_children(), le champ fts_link pointe sur la structure suivante dans la liste chainee des membres du repertoire, liste terminee par un NULL. Dans les autres situations, le contenu du champ fts_link est indetermine. fts_cycle Si un repertoire introduit une boucle dans la hierarchie (consultez FTS_DC), soit a cause d'un lien physique entre deux repertoires, soit a cause d'un lien symbolique pointant vers un repertoire, le champ fts_cycle pointera vers la structure FTSENT de la hierarchie qui reference le meme fichier que celui represente par la structure FTSENT. Sinon, le contenu du champ fts_cycle est indefini. fts_statp A pointer to [l] stat(2) information for the file. Un tampon unique est utilise pour tous les chemins d'acces de tous les fichiers de la hierarchie. Ainsi, les champs fts_path et fts_accpath sont assures d'etre termines par un caractere NULL seulement pour le fichier renvoye le plus recemment par fts_read(). Pour utiliser ces champs pour referencer un fichier represente par une autre structure FTSENT, il faut que le tampon du chemin soit modifie avec l'information contenue dans le champ fts_pathlen de cette structure FTSENT. Tout autre modification devra etre defaite avant que d'autres appels a fts_read() ne soient tentes. Le champ fts_name est toujours termine par un caractere NULL. fts_open() La fonction fts_open() recoit un pointeur vers une table de chaines de caracteres representant un ou plusieurs chemins decrivant la hierarchie de fichiers a traverser. Cette table doit se terminer par un pointeur NULL. Il existe un certain nombre d'options, dont au moins une est obligatoire (soit FTS_LOGICAL, soit FTS_PHYSICAL). Les options sont selectionnees par un ou logique entre les valeurs suivantes : FTS_LOGICAL Cette option indique aux fonctions fts de renvoyer des structures FTSENT concernant les cibles des liens symboliques plutot que les liens eux-memes. Avec cette option, les seuls liens symboliques pour lesquels une structure FTSENT est renvoyee sont ceux pointant des fichiers qui n'existent pas : le champ fts_statp est obtenu au moyen de stat(2) avec un repli vers lstat(2). FTS_PHYSICAL Avec cette option, les routines fts renvoient des structures FTSENT pour les liens symboliques eux-memes et non pas les fichiers qu'ils pointent. Si cette option est definie, des structures FTSENT pour tous les liens symboliques de la hierarchie sont renvoyees a l'application : le champ fts_statp est obtenu au moyen de lstat(2). FTS_COMFOLLOW Tout lien symbolique indique comme racine du parcours sera immediatement suivi, comme au moyen de FTS_LOGICAL, independamment du mode primaire. FTS_NOCHDIR Pour optimiser les performances, les fonctions fts changent de repertoire au cours de la traversee de la hierarchie de fichiers. En contrepartie, l'application ne peut pas savoir a l'avance ou elle se trouve durant la traversee. Cette option supprime cette optimisation et les fonctions fts ne changeront pas de repertoire de travail. Remarquez que les applications ne doivent pas modifier elles-memes le repertoire de travail et essayer d'acceder aux fichiers sans que l'option FTS_NOCHDIR ne soit indiquee et que des chemins d'acces absolus soient transmis a fts_open(). FTS_NOSTAT Par defaut, les structures FTSENT renvoyees contiennent les caracteristiques (voir le champ fts_statp) de chaque fichier visite. Cette option relache cette contrainte pour optimiser les performances, en autorisant les fonctions fts a remplir le champ fts_info avec FTS_NSOK et laisser le contenu du membre fts_statp indefini. FTS_SEEDOT Par defaut, a moins d'etre fourni explicitement en argument a fts_open(), tout fichier nomme << . >> ou << .. >> rencontre dans la hierarchie est ignore. Avec cette option, les routines fts renvoient des structures FTSENT pour ces fichiers. FTS_XDEV Cette option empeche fts de descendre dans les repertoires se trouvant sur un peripherique different de celui dans lequel le parcours a commence. L'argument compar() indique une fonction definie par l'utilisateur pour ordonner la traversee de la hierarchie. Elle prend en argument deux pointeurs sur des pointeurs sur des structures FTSENT, et doit renvoyer une valeur negative, zero ou positive pour indiquer que le fichier represente par le premier argument doit venir avant, a n'importe quel moment ou apres le fichier reference par le second argument. Les champs fts_accpath, fts_path et fts_pathlen des structures FTSENT ne doivent jamais etre utilises dans cette comparaison. Si le champ fts_info contient FTS_NS ou FTS_NSOK, le membre fts_statp ne doit pas etre utilise non plus. Si l'argument compar() est NULL, l'ordre de traversee des repertoires est celui de l'argument path_argv pour les racines, et l'ordre interne des repertoires pour le reste. fts_read() La fonction fts_read() renvoie un pointeur sur une structure FTSENT decrivant un fichier de la hierarchie. Les repertoires lisibles et ne causant pas de boucles sont parcourus au moins deux fois, une fois en phase << preorder >>, et une fois en phase << postorder >>. Les autres fichiers ne sont examines qu'une seule fois. Les liens physiques entre repertoires qui ne causent pas de boucles, ou les liens symboliques vers des liens symboliques peuvent entrainer des fichiers visites plus d'une fois, ou des repertoires plus de deux fois. Si tous les membres de la hierarchie ont ete examines, fts_read() renvoie NULL et definit la variable externe errno avec un 0. Si une erreur sans rapport avec un fichier particulier se produit, fts_read() renvoie NULL et definit errno pour indiquer l'erreur. Si une erreur concernant le fichier en cours se produit, un pointeur sur une structure FTSENT est renvoye, et errno peut ou non etre defini (consultez fts_info). Les structures FTSENT renvoyees par fts_read() peuvent etre ecrasees apres un appel a fts_close() sur le meme flux de hierarchie de fichiers ou apres un appel a fts_read() sur la meme flux de hierarchie, sauf si elles representent un repertoire, auquel cas elles ne seront pas ecrasees avant l'appel fts_read() renvoyant la structure FTSENT du repertoire en phase << postorder >>. fts_children() La fonction fts_children() renvoie un pointeur sur une structure FTSENT decrivant la premiere entree d'une liste chainee terminee par un NULL et representant les fichiers se trouvant dans le repertoire indique par la derniere structure FTSENT renvoyee par un appel fts_read(). La liste est chainee par le biais du membre fts_link de la structure FTSENT, et est ordonnee suivant la routine de comparaison fournie par l'utilisateur, si elle existe. Des appels repetes a fts_children() recreeront la liste chainee. Un cas particulier se presente si fts_read() n'a pas encore ete appelee pour une hierarchie. Alors, fts_children() renverra un pointeur sur les fichiers du repertoire logique indique a fts_open(), c'est-a-dire les arguments fournis a fts_open(). Sinon, si la structure FTSENT la plus recemment renvoyee par fts_read() n'est pas un repertoire visite en phase << preorder >>, ou si le repertoire ne contient aucun fichier, fts_children() renvoie NULL et met la variable externe errno a zero. Si une erreur se produit, fts_children() renvoie NULL et definit errno pour indiquer l'erreur. Les structures FTSENT renvoyees par fts_children() peuvent etre ecrasees apres un appel a fts_children(), fts_close() ou fts_read() sur le meme flux de hierarchie de fichiers. L'argument flags est soit zero, soit la valeur suivante : FTS_NAMEONLY Seuls les noms des fichiers sont necessaires. Le contenu des membres des structures de la liste chainee est indefini sauf pour fts_name et fts_namelen. fts_set() La fonction fts_set() permet a l'application de l'utilisateur de parametrer le traitement a venir du fichier f du flux ftsp. La fonction fts_set() renvoie 0 si elle reussit, et -1 si une erreur se produit. L'argument instr est un 0 (signifiant << ne rien faire >>) ou une des valeurs suivantes : FTS_AGAIN Revisiter a nouveau le fichier. N'importe quel type de fichier peut etre revisite. L'appel suivant de fts_read() renverra le fichier indique. Les membres fts_stat et fts_info de la structure seront reinitialises a ce moment, mais aucun autre champ ne sera modifie. Cette option n'a de sens que pour le dernier fichier renvoye par fts_read(). L'utilisation habituelle de cette possibilite concerne les repertoires en phase << postorder >>, qui sont alors reexamines (aussi bien en phase << preorder >> que << postorder >>), ainsi que leurs descendants. FTS_FOLLOW Le fichier reference doit etre un lien symbolique. Si ce fichier est le dernier renvoye par fts_read(), alors l'appel suivant de fts_read() renverra le fichier, avec les champs fts_info et fts_statp reinitialises pour representer la cible du lien symbolique plutot que le lien lui-meme. Si le fichier est des derniers renvoyes par fts_children(), alors les membres fts_info et fts_statp de la structure, lorsqu'elle sera renvoyee par fts_read(), representeront la cible du lien symbolique plutot que le lien lui-meme. Dans tous les cas, si la cible du lien symbolique n'existe pas, les membres de la structure ne seront pas modifies, et le champ fts_info contiendra FTS_SLNONE. Si la cible du lien est un repertoire, il y aura un retour << preorder >>, suivi d'un retour pour chaque descendant, suivi d'un retour << postorder >>. FTS_SKIP Aucun descendant de ce fichier ne sera visite. Le fichier peut etre un de ceux renvoyes le plus recemment par fts_children() ou fts_read(). fts_close() La fonction fts_close() ferme le flux de hierarchie de fichiers auquel ftsp fait reference et restitue le repertoire de travail qui etait en vigueur lors de l'appel fts_open() qui avait permit d'ouvrir ftsp. La fonction fts_close() renvoie 0 si elle reussit, et -1 en cas d'erreur. ERREURS La fonction fts_open() peut echouer et mettre dans errno l'une des erreurs indiquees pour les fonctions open(2) et malloc(3). De plus, fts_open() peut echouer et mettre dans errno l'une des erreurs suivantes : ENOENT Un element de path_argv etait une chaine vide. La fonction fts_close() peut echouer et mettre dans errno l'une des erreurs indiquees pour les fonctions chdir(2) et close(2). The functions fts_read() and fts_children() may fail and set errno for any of the errors specified for chdir(2), malloc(3), opendir(3), readdir(3), and [l] stat(2). De plus fts_children(), fts_open() et fts_set() peuvent echouer et mettre dans errno l'une des erreurs suivantes : EINVAL Les options ou les instr ne sont pas valables. ATTRIBUTS Pour une explication des termes utilises dans cette section, consulter attributes(7). +-------------------------------+--------------------------+-----------+ |Interface | Attribut | Valeur | +-------------------------------+--------------------------+-----------+ |fts_open(), fts_set(), | Securite des threads | MT-Safe | |fts_close() | | | +-------------------------------+--------------------------+-----------+ |fts_read(), fts_children() | Securite des threads | MT-Unsafe | +-------------------------------+--------------------------+-----------+ STANDARDS Aucune. HISTORIQUE glibc 2. 4.4BSD. BOGUES Avant la glibc 2.23, aucune des interfaces de programmation decrites dans cette page de manuel n'est sure lors de la compilation d'un programme utilisant les interfaces de programmation LFS (par exemple, lors de la compilation avec -D_FILE_OFFSET_BITS=64). VOIR AUSSI find(1), chdir(2), lstat(2), stat(2), ftw(3), qsort(3) TRADUCTION La traduction francaise de cette page de manuel a ete creee par Christophe Blaess , Stephan Rafin , Thierry Vignaud , Francois Micaux, Alain Portal , Jean-Philippe Guerard , Jean-Luc Coulon (f5ibh) , Julien Cristau , Thomas Huriaux , Nicolas Francois , Florentin Duneau , Simon Paillard , Denis Barbier , David Prevot et Jean-Pierre Giraud Cette traduction est une documentation libre ; veuillez vous reporter a la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITE LEGALE. Si vous decouvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message a . Pages du manuel de Linux 6.06 16 janvier 2024 fts(3)