BASENAME

Section : Manuel du programmeur Linux (3)
Mise à jour de la version anglaise : 14 décembre 2000
Index Menu principal  

NOM

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

SYNOPSIS

#include <libgen.h>

char *dirname(char *chemin);

char *basename(char *chemin);
 

DESCRIPTION

Attention : il y a deux fonctions basename() différentes - voir plus loin.

Les fonctions basename() et dirname() décomposent une chaîne terminée par un octet 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 « / », non inclus, 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 le chemin ne contient pas de barre oblique, dirname() renvoie la chaîne « . » et basename() renvoie une copie de la chaîne chemin. Si le chemin est représenté par la chaîne « / », alors dirname() et basename() renvoient tout deux la chaîne « / ». Si le chemin 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.

Autant dirname() que basename() peuvent modifier le contenu de la chaîne chemin, aussi, il est préférable de passer une copie de la chaîne lorsqu'on appelle ces fonctions.

Ces fonctions peuvent renvoyer des pointeurs sur des zones mémoires allouées statiquement, qui peuvent être écrasées par des appels consécutifs. Alternativement, ils peuvent renvoyer un pointeur sur une partie de chemin, aussi, la chaîne référencée par chemin ne doit pas être modifiée ou libérée avant que le pointeur renvoyé par la fonction ne soit plus nécessaire.

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

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 récupère avec

    #define _GNU_SOURCE

#include <string.h>
La version GNU ne modifie jamais son argument et renvoie une chaîne vide lorsque chemin 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 récupère la version POSIX de basename() lorsqu'est inclus <libgen.h>, et la version GNU autrement.  

BOGUES

Dans l'implémentation 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 version 2.2.1 de la glibc, les versions glibc de 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 *chemin = "/etc/passwd";

dirc = strdup(chemin);
basec = strdup(chemin);
dname = dirname(dirc);
bname = basename(basec);
printf("dirname=%s, basename=%s\n", dname, bname);
 

VOIR AUSSI

basename(1), dirname(1), feature_test_macros(7)  

TRADUCTION

Ce document est une traduction réalisée par Christophe Blaess <http://www.blaess.fr/christophe/> le 4 juin 2001 et révisée le 17 juillet 2008.

L'équipe de traduction a fait le maximum pour réaliser une adaptation française de qualité. La version anglaise la plus à jour de ce document est toujours consultable via la commande : « LANG=C man 3 basename ». N'hésitez pas à signaler à l'auteur ou au traducteur, selon le cas, toute erreur dans cette page de manuel.

 

Index

NOM
SYNOPSIS
DESCRIPTION
VALEUR RENVOYÉE
CONFORMITÉ
NOTES
BOGUES
EXEMPLE
VOIR AUSSI
TRADUCTION

Dernière mise à jour : 17 juillet 2008