NOMBRE¶
dirname, basename - Analiza los componentes de un nombre de ruta
SINOPSIS¶
#include <libgen.h>
char *dirname(char *path);
char *basename(char *path);
DESCRIPCIÓN¶
Las funciones
dirname y
basename descomponen un nombre de ruta
terminado en null en un directorio y un nombre de fichero. En el caso
habitual,
dirname devuelve la cadena que precede, pero no incluye, al
último carácter '/', y
basename devuelve el componente que
sigue al último carácter '/'. Los carácteres '/' del final no
se cuentan como parte del nombre de ruta.
Si
path no contiene una barra,
dirname devuelve la cadena
"." mientras que
basename devuelve una copia de
path.
Si
path es la cadena "/", entonces tanto
dirname como
basename devuelven la cadena "/". Si
path es un
puntero a NULL o apunta a una cadena vacía, entonces tanto
dirname
como
basename devuelven la cadena ".".
Concatenando la cadena devuelta por
dirname, un carácter
"/", y la cadena devuelta por
basename se obtiene el nombre
de ruta completo.
Tanto
dirname como
basename pueden modificar el contenido de
path, así que si necesita preservar la cadena pathname,
debería pasar una copia de ella a estas funciones. Además,
dirname y
basename pueden devolver punteros a memoria
estática que puede ser sobreescrita en llamadas posteriores.
La siguiente lista de ejemplos (extraídos de SUSv2) muestra las cadenas
devueltas por
dirname y
basename para diferentes rutas:
ruta dirname basename
"/usr/lib" "/usr" "lib"
"/usr/" "/" "usr"
"usr" "." "usr"
"/" "/" "/"
"." "." "."
".." "." ".."
EJEMPLO¶
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);
free(dirc);
free(basec);
VALOR DEVUELTO¶
Tanto
dirname como
basename devuelven punteros a cadenas
terminadas en null.
FALLOS¶
En versiones de glibc anteriores a 2.2.1 (incluída),
dirname no
maneja correctamente los nombres de ruta con carácteres '/' al final, y
provoca una violación de segmento si se le pasa un argumento NULL.
SUSv2
VÉASE TAMBIÉN¶
dirname(1),
basename(1),