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()
возвращают
целое,
меньшее,
равное или
большее
нуля, если
первый
аргумент
считается
меньшим,
равным или
большим
чем второй,
соответственно.
- 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 <
[email protected]>, Azamat Hackimov
<
[email protected]>, Hotellook, Nikita
<
[email protected]>, Spiros Georgaras <
[email protected]>, Vladislav
<
[email protected]>, Yuri Kozlov <
[email protected]>
и Иван
Павлов <
[email protected]>
Этот
перевод
является
бесплатной
документацией;
прочитайте
Стандартную
общественную
лицензию GNU
версии 3
или более
позднюю,
чтобы
узнать об
условиях
авторского
права. Мы не
несем
НИКАКОЙ
ОТВЕТСТВЕННОСТИ.
Если вы
обнаружите
ошибки в
переводе
этой
страницы
руководства,
пожалуйста,
отправьте
электронное
письмо на
[email protected]