scandir(3) | Library Functions Manual | scandir(3) |
scandir, scandirat, alphasort, versionsort - ищет записи в каталоге
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 **));
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() работает также как системный вызов 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() возвращают целое, меньшее, равное или большее нуля, если первый аргумент считается меньшим, равным или большим чем второй, соответственно.
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 или более позднюю, чтобы узнать об условиях авторского права. Мы не несем НИКАКОЙ ОТВЕТСТВЕННОСТИ.
Если вы обнаружите ошибки в переводе этой страницы руководства, пожалуйста, отправьте электронное письмо на man-pages-ru-talks@lists.sourceforge.net.
5 февраля 2023 г. | Linux man-pages 6.03 |