1. NOM

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

2. SYNOPSIS

 
Sélectionnez
#include <libgen.h>
char *dirname(char *path);
char *basename(char *path);

3. 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 :

lb lb lb
chemin dirname basename
/usr/lib /usr lib
/usr/ / usr
usr . usr
/ / /
. . .

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

5. CONFORMITÉ

POSIX.1-2001.

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

 
Sélectionnez
    #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.

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

8. EXEMPLE

 
Sélectionnez
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);

9. VOIR AUSSI

basename(1), dirname(1)

10. COLOPHON

Cette page fait partie de la publication 3.52 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/.

11. 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 à < >.

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