dirname, basename − wydzielenie składników nazwy ścieżki dostępu
#include <libgen.h>
char *dirname(char *path);
char *basename(char *path);
Funkcje dirname i basename rozbijają zakończony znakiem null łańcuch nazwy ścieżki dostępu na składowe: katalog i nazwę pliku. W typowym przypadku dirname zwraca łańcuch aż do ostatniego znaku ’/’, ale z jego wyłączeniem, a basename zwraca składową następującą po ostatnim ’/’. Końcowe znaki ’/’ nie są uważane za część nazwy ścieżki dostępu.
Jeśli path nie zawiera ukośnika, dirname zwraca łańcuch ".", podczas gdy basename zwraca kopię path. Jeśli path jest łańcuchem "/", wówczas zarówno dirname jak i basename zwracają łańcuch "/". Jeśli path jest wskaźnikiem NULL lub wskazuje na pusty łańcuch znaków, to zarówno dirname jak i basename zwracają łańcuch ".".
Połączenie łańcucha zwróconego przez dirname, "/" i łańcucha zwróconego przez basename daje pełną nazwę ścieżki dostępu.
Zarówno dirname jak i basename mogą modyfikować zawartość path, więc jeżeli chce się zachować łańcuch ścieżki dostępu, to należy przekazywać do tych funkcji jego kopię. Ponadto dirname i basename mogą zwracać wskaźniki do pamięci przydzielonej statycznie, która może być nadpisana następnymi wywołaniami.
Poniższa lista przykładów (wzięta z SUSv2) pokazuje łańcuchy znaków zwracane przez dirname i basename dla różnych ścieżek:
|
ścieżka |
dirname |
basename |
||||||
|
"/usr/lib" |
"/usr" |
"lib" | ||||||
|
"/usr/" |
"/" |
"usr" | ||||||
|
"usr" |
"." |
"usr" | ||||||
|
"/" |
"/" |
"/" | ||||||
|
"." |
"." |
"." | ||||||
|
".." |
"." |
".." |
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);
Zarówno dirname jak i basename zwracają wskaźniki do zakończonych znakiem null łańcuchów znaków.
W wersjach glibc aż do 2.2.1 włącznie, dirname nieprawidłowo obsługuje nazwy ścieżek dostępu z końcowymi znakami ’/’, i generuje naruszenie segmentacji, gdy poda się NULL jako argument.
SUSv2
Powyższe tłumaczenie pochodzi z nieistniejącego już Projektu Tłumaczenia Manuali i może nie być aktualne. W razie zauważenia różnic między powyższym opisem a rzeczywistym zachowaniem opisywanego programu lub funkcji, prosimy o zapoznanie się z oryginalną (angielską) wersją strony podręcznika.