BASENAME(3)

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

SYNOPSIS
#include <libgen.h>

char *basename(char *chemin);
char *dirname(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 compris, 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 22 décembre 2007.

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.