NAZWA¶
basename, dirname - wydzielenie składników nazwy
ścieżki
SKŁADNIA¶
#include <libgen.h>
char *dirname(char *path);
char *basename(char *path);
OPIS¶
Ostrzeżenie: istnieją dwie różne funkcje
basename() — patrz niżej.
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 "/", to 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() z "/" i łańcuchem zwróconym
przez
basename() daje pełną nazwę
ścieżki dostępu.
Zarówno
dirname(), jak i
basename() mogą
zmienić zawartość
path, tak więc
może być potrzebne przekazanie kopii podczas wywoływania
którejkolwiek z tych funkcji.
Funkcje te mogą zwrócić wskaźniki do statycznie
alokowanej pamięci, która może zostać nadpisana
przez kolejne wywołania. Alternatywnie mogą
zwrócić wskaźniki do części
path,
tak że łańcuch znaków wskazywany przez
path
nie powinien być ani zmieniany, ani usuwany aż do momentu, w
którym wskaźnik zwrócony przez opisywane funkcje nie
będzie już potrzebny.
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 |
|
/ |
/ |
/ |
|
. |
. |
. |
|
.. |
. |
.. |
|
WARTOŚĆ ZWRACANA¶
Zarówno
dirname(), jak i
basename() zwracają
wskaźniki do zakończonych znakiem null
łańcuchów znaków (nie należy tych
wskaźników przekazywać do
free(3)).
ATRYBUTY¶
Wielowątkowość (patrz pthreads(7))¶
Funkcje
basename() i
dirname() są wątkowo
bezpieczne.
ZGODNE Z¶
POSIX.1-2001.
UWAGI¶
Istnieją dwie różne wersji funkcji
basename():
wersja POSIX opisana powyżej oraz wersja GNU, która jest
dostępna po
#define _GNU_SOURCE /* Patrz feature_test_macros(7) */
#include <string.h>
Wersja GNU nigdy nie zmienia swojego argumentu oraz zwraca pusty
łańcuch znaków, jeśli
path kończy
się znakiem ukośnika, w szczególności gdy
path jest równe "/". Nie istnieje wersja GNU funkcji
dirname().
W bibliotece GNU wersja POSIX funkcji
basename() jest używana, gdy
dołączony jest plik nagłówkowy
<libgen.h>. W przeciwnym wypadku używana jest wersja GNU.
BŁĘDY IMPLEMENTACJI¶
W implementacji biblioteki glibc POSIX-owych wersji tych funkcji
modyfikują one swoje argumenty i powodują błąd
naruszenia ochrony pamięci, jeśli są wywołane z
statycznym łańcuchem znaków takim jak "/usr".
Do wersji 2.2.1 biblioteki glibc
dirname() niepoprawnie
obsługiwało nazwy ścieżek dostępu z
końcowymi znakami "/" i generowało błąd
naruszenia ochrony pamięci, gdy podało się się
NULL jako argument.
PRZYKŁAD¶
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);
ZOBACZ TAKŻE¶
basename(1),
dirname(1)
O STRONIE¶
Angielska wersja tej strony pochodzi z wydania 3.71 projektu Linux
man-pages. Opis projektu, informacje dotyczące zgłaszania
błędów, oraz najnowszą wersję
oryginału można znaleźć pod adresem
http://www.kernel.org/doc/man-pages/.
TŁUMACZENIE¶
Autorami polskiego tłumaczenia niniejszej strony podręcznika man
są: Andrzej Krzysztofowicz (PTM) <ankry@mif.pg.gda.pl>, Robert
Luberda <robert@debian.org> i Michał Kułach
<michal.kulach@gmail.com>.
Polskie tłumaczenie jest częścią projektu
manpages-pl; uwagi, pomoc, zgłaszanie błędów na
stronie
http://sourceforge.net/projects/manpages-pl/. Jest zgodne z
wersją
3.71 oryginału.