Provided by: manpages-ru-dev_4.19.0-7_all
ИМЯ
scandir, scandirat, alphasort, versionsort - ищет записи в каталоге
LIBRARY
Standard C library (libc, -lc)
СИНТАКСИС
#include <dirent.h> int scandir(const char *restrict dirp, struct dirent ***restrict namelist, int (*filter)(const struct dirent *), int (*compar)(const struct dirent **, const struct dirent **)); int alphasort(const struct dirent **a, const struct dirent **b); int versionsort(const struct dirent **a, const struct dirent **b); #include <fcntl.h> /* определения констант AT_* */ #include <dirent.h> int scandirat(int dirfd, const char *restrict dirp, struct dirent ***restrict namelist, int (*filter)(const struct dirent *), int (*compar)(const struct dirent **, const struct dirent **)); Требования макроса тестирования свойств для glibc (см. feature_test_macros(7)): scandir(), alphasort(): /* Since glibc 2.10: */ _POSIX_C_SOURCE >= 200809L || /* glibc <= 2.19: */ _BSD_SOURCE || _SVID_SOURCE versionsort(): _GNU_SOURCE scandirat(): _GNU_SOURCE
ОПИСАНИЕ
Функция scandir() обходит каталог dirp, вызывая filter() для каждой записи каталога. Записи, для которых filter() возвращает не ноль, сохраняются в строках, выделяемых с помощью malloc(3), сортируются qsort(3) с помощью функции сравнения compar() и собираются в массиве namelist, который выделяется с помощью malloc(3). Если filter равно NULL, то выбираются все записи. В качестве функции сравнения compar() можно использовать alphasort() и versionsort(). Первая сортирует записи (строки (*a)->d_name и (*b)->d_name) каталога с помощью strcoll(3), а последняя с помощью strverscmp(3). scandirat() Системный вызов scandirat() работает также как системный вызов scandir(), за исключением случаев, описанных здесь. Если в dirp задан относительный путь, то он считается относительно каталога, на который ссылается файловый дескриптор dirfd (а не относительно текущего рабочего каталога вызывающего процесса, как это делается в scandir()). Если в dirp задан относительный путь и значение dirfd равно AT_FDCWD, то dirp рассматривается относительно текущего рабочего каталога вызывающего процесса (как scandir()). Если в dirp задан абсолютный путь, то dirfd игнорируется. Смотрите в openat(2) объяснение необходимости scandirat().
ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
The scandir() function returns the number of directory entries selected. On error, -1 is returned, with errno set to indicate the error. Функции alphasort() и versionsort() возвращают целое, меньшее, равное или большее нуля, если первый аргумент считается меньшим, равным или большим чем второй, соответственно.
ОШИБКИ
EBADF (scandirat()) dirp is relative but dirfd is neither AT_FDCWD nor a valid file descriptor. ENOENT Путь в dirp не существует. ENOMEM Недостаточно памяти для завершения операции. ENOTDIR Путь в dirp не является каталогом. ENOTDIR (scandirat()) dirp is a relative pathname and dirfd is a file descriptor referring to a file other than a directory.
ВЕРСИИ
versionsort() was added in glibc 2.1. scandirat() was added in glibc 2.15.
АТРИБУТЫ
Описание терминов данного раздела смотрите в attributes(7). ┌─────────────────────────────────────────────────┬──────────────────────┬────────────────┐ │Интерфейс │ Атрибут │ Значение │ ├─────────────────────────────────────────────────┼──────────────────────┼────────────────┤ │scandir(), scandirat() │ Безвредность в нитях │ MT-Safe │ ├─────────────────────────────────────────────────┼──────────────────────┼────────────────┤ │alphasort(), versionsort() │ Безвредность в нитях │ MT-Safe locale │ └─────────────────────────────────────────────────┴──────────────────────┴────────────────┘
СТАНДАРТЫ
alphasort(), scandir(): 4.3BSD, POSIX.1-2008. Функции versionsort() и scandirat() являются расширениями GNU.
ЗАМЕЧАНИЯ
Начиная с glibc 2.1, alphasort() вызывает strcoll(3); раньше в ней использовалась strcmp(3). До glibc 2.10, два аргумента alphasort() и versionsort() имели тип const void *. После стандартизации alphasort() в POSIX.1-2008, тип аргумента argument стал типобезопасным const struct dirent **, и в glibc 2.10 функция alphasort() (и нестандартная versionsort()) была приведена в соответствие со стандартом.
ПРИМЕРЫ
Программа, показанная ниже, печатает список файлов в текущем каталоге в обратном порядке. Исходный код программы #define _DEFAULT_SOURCE #include <dirent.h> #include <stdio.h> #include <stdlib.h> int main(void) { struct dirent **namelist; int n; n = scandir(".", &namelist, NULL, alphasort); if (n == -1) { perror("scandir"); exit(EXIT_FAILURE); } while (n--) { printf("%s\n", namelist[n]->d_name); free(namelist[n]); } free(namelist); exit(EXIT_SUCCESS); }
СМ. ТАКЖЕ
closedir(3), fnmatch(3), opendir(3), readdir(3), rewinddir(3), seekdir(3), strcmp(3), strcoll(3), strverscmp(3), telldir(3)
ПЕРЕВОД
Русский перевод этой страницы руководства был сделан Alexander Golubev <fatzer2@gmail.com>, Azamat Hackimov <azamat.hackimov@gmail.com>, Hotellook, Nikita <zxcvbnm3230@mail.ru>, Spiros Georgaras <sng@hellug.gr>, Vladislav <ivladislavefimov@gmail.com>, Yuri Kozlov <yuray@komyakino.ru> и Иван Павлов <pavia00@gmail.com> Этот перевод является бесплатной документацией; прочитайте Стандартную общественную лицензию GNU версии 3 ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ. Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на ⟨man-pages-ru-talks@lists.sourceforge.net⟩.