BASENAME(3)

NOM
basename, dirname - Analyse des composants d'un chemin d'accès

SYNOPSIS
#include <libgen.h>

char *dirname(char *path);
char *basename(char *path);

DESCRIPTION
Attention : il y a deux fonctions basename différentes; consultez ci-dessous.

Les fonctions basename() et dirname() décomposent une chaîne terminée par un caractère nul, représentant un chemin d'accès 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 chaîne ne font pas partie du chemin.

Si path ne contient pas de barre oblique, dirname() renvoie la chaîne « . » et basename() renvoie une copie de la chaîne path. Si path est représenté par la chaîne « / », alors dirname() et basename() renvoient tout deux la chaîne « / ». Si path est un pointeur NULL, ou pointe vers une chaîne vide, alors dirname() et basename() renvoient tout 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 tous deux modifier le contenu de path, il est donc préférable de passer une copie de celui-ci lors d'un appel à l'une de ces fonctions.

Ces fonctions devraient renvoyer des pointeurs vers de la mémoire allouée statiquement qui peut être réécrite par des appels ultérieurs. Cependant, il pourraient renvoyer un pointeur vers une partie de path, ainsi la chaîne référencée par path ne doit pas être modifiée ou libérée tant que le pointeur renvoyé par la fonction ne possède pas la bonne longueur.

La liste suivante d'exemple (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 nul. (Ne pas passer ces pointeurs à free(3).)

ATTRIBUTS

  Multithreading (voir pthreads(7))
Les fonctions basename() et dirname() sont sûres dans un contexte multithread.

CONFORMITÉ
POSIX.1-2001.

NOTES
Il y a 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 path finit 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 sinon.

BOGUES
Dans l'implémentation de la glibc des versions POSIX de ces fonctions, celles-ci modifient leur argument et provoquent une erreur de segmentation lorsqu'elles sont invoquées avec une chaîne statique comme « /usr/ ». Avant la glibc 2.2.1, la fonction dirname() ne géraient pas correctement les chemins se terminant par un caractère « / » et déclenchaient une erreur de segmentation en recevant un pointeur NULL.

EXEMPLE
char *dirc, *basec, *bname, *dname;
char *path = "/etc/passwd";
dirc = strdup(path);
basec = strdup(path);
dname = dirname(dirc);
bname = basename(basec);
printf("dirname=%s, basename=%s\n", dname, bname);

VOIR AUSSI
basename(1), dirname(1)

COLOPHON
Cette page fait partie de la publication 3.70 du projet man-pages Linux. Une description du projet et des instructions pour signaler des anomalies peuvent être trouvées à l'adresse http://www.kernel.org/doc/man-pages/.

TRADUCTION
Depuis 2010, cette traduction est maintenue à l'aide de l'outil po4a <http://po4a.alioth.debian.org/> par l'équipe de traduction francophone au sein du projet perkamon <http://perkamon.alioth.debian.org/>.

Christophe Blaess <http://www.blaess.fr/christophe/> (1996-2003), Alain Portal <http://manpagesfr.free.fr/> (2003-2006). Florentin Duneau et l'équipe francophone de traduction de Debian (2006-2009).

Veuillez signaler toute erreur de traduction en écrivant à <perkamon-fr@traduc.org>.

Vous pouvez toujours avoir accès à la version anglaise de ce document en utilisant la commande « LC_ALL=C man <section> <page_de_man> ».