basename, dirname - wydzielenie składników nazwy
ścieżki
Standardowa biblioteka C (
libc,
-lc)
#include <libgen.h>
char *dirname(char *path);
char *basename(char *path);
Ostrzeżenie: istnieją dwie różne funkcje
basename(); patrz niżej.
The functions
dirname() and
basename() break a null-terminated
pathname string into directory and filename components. In the usual case,
dirname() returns the string up to, but not including, the final '/',
and
basename() returns the component following the final '/'. Trailing
'/' characters are not counted as part of the pathname.
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 |
|
/ |
/ |
/ |
|
. |
. |
. |
|
.. |
. |
.. |
|
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)).
Informacje o pojęciach używanych w tym rozdziale można
znaleźć w podręczniku
attributes(7).
Interfejs |
Atrybut |
Wartość |
basename(), dirname() |
Bezpieczeństwo wątkowe |
MT-Safe |
POSIX.1-2001, POSIX.1-2008.
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.
W implementacji biblioteki glibc POSIX-owych wersji tych funkcji
modyfikują argument
path i powodują błąd
naruszenia ochrony pamięci, jeśli są wywołane z
statycznym łańcuchem znaków takim jak "/usr/".
Before glibc 2.2.1, the glibc version of
dirname() did not correctly
handle pathnames with trailing '/' characters, and generated a segfault if
given a NULL argument.
Następujący przykładowy kod pokazuje użycie funkcji
basename() i
dirname():
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);
basename(1),
dirname(1)
Autorami polskiego tłumaczenia niniejszej strony podręcznika
są: Andrzej Krzysztofowicz <
[email protected]>, Robert
Luberda <
[email protected]> i Michał Kułach
<
[email protected]>
Niniejsze tłumaczenie jest wolną dokumentacją.
Bliższe informacje o warunkach licencji można uzyskać
zapoznając się z
GNU
General Public License w wersji 3 lub nowszej. Nie przyjmuje się
ŻADNEJ ODPOWIEDZIALNOŚCI.
Błędy w tłumaczeniu strony podręcznika prosimy
zgłaszać na adres listy dyskusyjnej
[email protected]