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
<
[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]