Linux |
CentOS 5.3 |
|
basename(3) |
basename, dirname − Analyse des composants d’un chemin d’accès. |
#include <libgen.h> char *basename(char *chemin); char *dirname(char *chemin); |
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 faut leur transmettre des copies de la chaîne. De plus, dirname() et basename() peuvent renvoyer des pointeurs sur des zones mémoires allouées statiquement, qui peuvent être écrasées par des appels consécutifs. 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 » « / » « / » « / » « . » « . » « . » « .. » « .. » « .. » |
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); |
Les fonctions dirname() et basename() renvoient des pointeurs sur des chaînes terminées par un octet nul. |
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 renvoye 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. |
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. |
POSIX.1-2001. |
basename(1), dirname(1) |
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 14 août 2006. 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. |
basename(3) |