NOM

basename, dirname - Analyser les composants d'un chemin d'accès

BIBLIOTHÈQUE

Bibliothèque C standard ( libc, -lc)

SYNOPSIS

#include <libgen.h>
char *dirname(char *chemin);
char *basename(char *chemin);

DESCRIPTION

Attention : il existe deux fonctions basename() différentes ; voir ci-dessous.
Les fonctions dirname() et basename() décomposent un chemin d'accès, représenté sous la forme d'une chaîne terminée par un caractère NULL, en ses composants répertoire et nom de fichier. En général, dirname() renvoie la chaîne s'étendant jusqu'au dernier « / », sans l'inclure, et basename() renvoie la partie se trouvant après le dernier « / ». Les caractères « / » en fin de chemin n'en font pas partie.
Si chemin ne contient pas de barre oblique, dirname() renvoie la chaîne « . » et basename() renvoie une copie de la chaîne chemin. Si chemin correspond à la chaîne « / », alors dirname() et basename() renvoient toutes deux la chaîne « / ». Si chemin est un pointeur NULL ou pointe vers une chaîne vide, alors dirname() et basename() renvoient toutes deux la chaîne « . ».
En mettant bout à bout la chaîne renvoyée par dirname(), un « / » et la chaîne renvoyée par basename(), on obtient un chemin d'accès complet.
dirname() et basename() peuvent toutes deux modifier le contenu de chemin ; il est donc souhaitable de passer une copie de celui-ci lors d'un appel à l'une de ces fonctions.
Ces fonctions peuvent renvoyer des pointeurs vers de la mémoire allouée statiquement qui peut être écrasée par des appels ultérieurs. Elles peuvent aussi renvoyer un pointeur vers une partie de chemin, de façon à ce que la chaîne référencée par chemin ne puisse être modifiée ou libérée que lorsque le pointeur renvoyé par la fonction ne sera plus nécessaire.
La liste d'exemples suivante (prise dans SUSv2) montre les chaînes renvoyées par dirname() et basename() pour différents chemins d'accès :
chemin dirname basename
/usr/lib /usr lib
/usr/ / usr
usr . usr
/ / /
. . .
.. . ..

VALEUR RENVOYÉE

Les fonctions dirname() et basename() renvoient des pointeurs sur des chaînes terminées par un caractère NULL (ne pas passer ces pointeurs à free(3)).

ATTRIBUTS

Pour une explication des termes utilisés dans cette section, consulter attributes(7).
Interface Attribut Valeur
basename(), dirname() Sécurité des threads MT-Safe
 

STANDARDS

POSIX.1-2001, POSIX.1-2008.

NOTES

Il existe deux versions différentes de basename() : la version POSIX décrite précédemment et la version GNU que l'on utilise avec

    #define _GNU_SOURCE         /* Consultez feature_test_macros(7) */
#include <string.h>

La version GNU ne modifie jamais son argument et renvoie une chaîne vide lorsque chemin se termine par une barre oblique « / », et en particulier aussi lorsqu'il vaut « / ». Il n'y a pas de version GNU de dirname().
Avec la glibc, on utilise la version POSIX de basename() lorsque <libgen.h> est inclus et la version GNU dans le cas contraire.

BOGUES

Dans l'implémentation de la glibc, les versions POSIX de ces fonctions modifient l'argument chemin et génèrent une erreur de segmentation lorsqu'elles sont appelées avec une chaîne statique comme « /usr/ ».
Avant la glibc 2.2.1, la version de la glibc de la fonction dirname() ne gérait pas correctement les chemins se terminant par un caractère « / » et générait une erreur de segmentation lorsqu'on lui passait un pointeur NULL comme argument.

EXEMPLES

L'extrait de code suivant montre l'utilisation de basename() et dirname() :
char *copie_rep, *copie_base, *nom_base, *nom_rep;
char *chemin = "/etc/passwd";
copie_rep = strdup(chemin); copie_base = strdup(chemin); nom_rep = dirname(copie_rep); nom_base = basename(copie_base); printf("Nom répertoire = %s, Nom base = %s\n", nom_rep, nom_base);

VOIR AUSSI

basename(1), dirname(1)

TRADUCTION

La traduction française de cette page de manuel a été créée par Christophe Blaess <https://www.blaess.fr/christophe/>, Stéphan Rafin <[email protected]>, Thierry Vignaud <[email protected]>, François Micaux, Alain Portal <[email protected]>, Jean-Philippe Guérard <[email protected]>, Jean-Luc Coulon (f5ibh) <[email protected]>, Julien Cristau <[email protected]>, Thomas Huriaux <[email protected]>, Nicolas François <[email protected]>, Florentin Duneau <[email protected]>, Simon Paillard <[email protected]>, Denis Barbier <[email protected]>, David Prévot <[email protected]> et Lucien Gentis <[email protected]>
Cette traduction est une documentation libre ; veuillez vous reporter à la GNU General Public License version 3 concernant les conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.
Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un message à [email protected]

Recommended readings

Pages related to basename you should read also: