Scroll to navigation

scandir(3) Library Functions Manual scandir(3)

ИМЯ

scandir, scandirat, alphasort, versionsort - ищет записи в каталоге

БИБЛИОТЕКА

Стандартная библиотека языка C (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() возвращают целое, меньшее, равное или большее нуля, если первый аргумент считается меньшим, равным или большим чем второй, соответственно.

ОШИБКИ

(scandirat()) dirp is relative but dirfd is neither AT_FDCWD nor a valid file descriptor.
Путь в dirp не существует.
Недостаточно памяти для завершения операции.
Путь в dirp не является каталогом.
(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 (GNU General Public License - GPL, https://www.gnu.org/licenses/gpl-3.0.html версии 3 или более поздней) в отношении авторского права, но БЕЗ КАКИХ-ЛИБО ГАРАНТИЙ.

Если вы обнаружите какие-либо ошибки в переводе этой страницы руководства, пожалуйста, сообщите об этом разработчику(ам) по его(их) адресу(ам) электронной почты или по адресу списка рассылки русских переводчиков.

5 февраля 2023 г. Справочные страницы Linux 6.03