basename(3) Library Functions Manual basename(3)

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

Bibliothèque C standard (libc, -lc)

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

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
/ / /
. . .
.. . ..

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)).

Pour une explication des termes utilisés dans cette section, consulter attributes(7).

Interface Attribut Valeur
basename(), dirname() Sécurité des threads MT-Safe

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

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.

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.

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);

basename(1), dirname(1)

La traduction française de cette page de manuel a été créée par Christophe Blaess https://www.blaess.fr/christophe/, Stéphan Rafin <stephan.rafin@laposte.net>, Thierry Vignaud <tvignaud@mandriva.com>, François Micaux, Alain Portal <aportal@univ-montp2.fr>, Jean-Philippe Guérard <fevrier@tigreraye.org>, Jean-Luc Coulon (f5ibh) <jean-luc.coulon@wanadoo.fr>, Julien Cristau <jcristau@debian.org>, Thomas Huriaux <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>, Denis Barbier <barbier@debian.org>, David Prévot <david@tilapin.org> et Lucien Gentis <lucien.gentis@waika9.com>

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 à debian-l10n-french@lists.debian.org.

15 décembre 2022 Pages du manuel de Linux 6.02