basename, dirname -
разделяет
путь на
компоненты
Standard C library (
libc,
-lc)
#include <libgen.h>
char *dirname(char *path);
char *basename(char *path);
Warning: there are two different functions
basename(); see below.
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.
Если
path не
содержит
косую
черту, то
dirname()
возвращает
строку «.», а
basename()
возвращает
копию
path.
Если
строка
path
равна «/», то
dirname() и
basename()
возвращают
строку «/».
Если
значение
path
равно
указателю null
или
указывает
на пустую
строку, то
dirname() и
basename()
возвращают
строку «.».
Если
объединить
строку,
возвращаемую
dirname(), «/» и
строку,
возвращаемую
basename(), то
получится
первоначальный
путь.
Функции
dirname()
и
basename() могут
изменить
содержимое
path, поэтому
желательно
передавать
копию
строки при
их вызове.
Данные
функции
могут
возвращать
указатели
на
статически
выделенную
память,
которая
может
измениться
при
последующих
вызовах.
Или же они
могут
возвращать
указатель
на часть
path,
поэтому
строка, на
которую
ссылается
path, не должна
изменяться
или
освобождаться
до тех пор,
пока
указатель,
возвращаемый
функцией,
станет
ненужным.
В
следующих
примерах
(взяты из SUSv2)
показаны
строки,
возвращаемые
dirname() и
basename() для
различных
путей:
путь |
dirname |
basename |
|
/usr/lib |
/usr |
lib |
|
/usr/ |
/ |
usr |
|
usr |
. |
usr |
|
/ |
/ |
/ |
|
. |
. |
. |
|
.. |
. |
.. |
|
Функции
dirname()
и
basename()
возвращают
указатели
на строки,
оканчивающиеся
null (не
передавайте
эти
указатели
free(3)).
Описание
терминов
данного
раздела
смотрите в
attributes(7).
Интерфейс |
Атрибут |
Значение |
basename(), dirname() |
Безвредность
в нитях |
MT-Safe |
POSIX.1-2001, POSIX.1-2008.
Существует
две
различные
версии
basename() —
версия POSIX,
описанная
выше, и
версия GNU,
которая
описана
далее
#define _GNU_SOURCE /* смотрите feature_test_macros(7) */
#include <string.h>
Версия GNU
никогда не
изменяет
свои
аргументы
и
возвращает
пустую
строку,
если
path
оканчивается
символом
косой
черты, а в
частности,
если
значение
равно «/».
Версии GNU для
dirname() не
существует.
Если в
исходный
код
включён
файл
<libgen.h>, то
из glibc
используется
версия
basename(),
описанная
в POSIX, иначе —
версия GNU.
Функции
версии POSIX,
реализованные
в glibc,
изменяют
аргумент
path,
что
приводит к
ошибки
сегментации
при их
вызове со
статической
строкой
вида «/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.
Следующий
пример
кода
демонстрирует
использование
basename() и
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)
Русский
перевод
этой
страницы
руководства
был сделан
Artyom Kunyov <
[email protected]>, Azamat Hackimov
<
[email protected]>, Dmitriy Ovchinnikov
<
[email protected]>, Dmitry Bolkhovskikh <
[email protected]>,
ITriskTI <
[email protected]>, Yuri Kozlov <
[email protected]>
и Иван
Павлов <
[email protected]>
Этот
перевод
является
бесплатной
документацией;
прочитайте
Стандартную
общественную
лицензию GNU
версии 3
или более
позднюю,
чтобы
узнать об
условиях
авторского
права. Мы не
несем
НИКАКОЙ
ОТВЕТСТВЕННОСТИ.
Если вы
обнаружите
ошибки в
переводе
этой
страницы
руководства,
пожалуйста,
отправьте
электронное
письмо на
[email protected]