Provided by: manpages-ru-dev_4.18.1-1_all bug

ИМЯ

       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⟩.