Manpages

名 前

scandir, scandirat, alphasort, versionsort − デ ィ レ ク ト リ を 走 査 す る

書 式

#include <dirent.h>

int scandir(const char *dirp, struct dirent ***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 *dirp, struct dirent ***namelist,

int (*filter)(const struct dirent *),
int (*
compar)(const struct dirent **, const struct dirent **));

glibc 向 け の 機 能 検 査 マ ク ロ の 要 件 (feature_test_macros(7) 参 照 ):

scandir(), alphasort():

_BSD_SOURCE || _SVID_SOURCE
|| /* glibc 2.10 以 降 : */

(_POSIX_C_SOURCE >= 200809L || _XOPEN_SOURCE >= 700)

versionsort(): _GNU_SOURCE

scandirat(): _GNU_SOURCE

説 明

関 数 scandir() は デ ィ レ ク ト リ dirp を 走 査 し 、 デ ィ レ ク ト リ の 各 エ ン ト リ ー を 引 き 数 と し て filter() を 呼 び 出 す 。 filter() が 0 以 外 の 値 を 返 す エ ン ト リ ー は malloc(3) に よ っ て 確 保 さ れ た 文 字 列 に 保 存 さ れ 、 比 較 関 数 compar() を 用 い て qsort(3) に よ り ソ ー ト さ れ 、 malloc(3) に よ り 確 保 さ れ た 配 列 namelist に ま と め ら れ る 。 filter が NULL な ら ば 、 す べ て の エ ン ト リ ー が 選 択 さ れ る 。 比 較 関 数 compar() に は alphasort() 関 数 と versionsort() 関 数 を 使 う こ と が で き る 。 alphasort() は strcoll(3) を 用 い て デ ィ レ ク ト リ エ ン ト リ ー を ソ ー ト し 、 versionsort() は 文 字 列 (*a)−>d_name(*b)−>d_name に 対 し て strverscmp(3) を 用 い る 。

scandirat()
scandirat
() 関 数 は scandir() と 全 く 同 様 の 動 作 を す る 。 差 分 に つ い て は こ こ で 説 明 す る 。

dirp で 指 定 さ れ た パ ス 名 が 相 対 パ ス の 場 合 、 フ ァ イ ル デ ィ ス ク リ プ タ ー dirfd が 参 照 す る デ ィ レ ク ト リ か ら の 相 対 パ ス と 解 釈 さ れ る (こ れ に 対 し て 、 scandir() の 場 合 は 、 相 対 パ ス 名 は 、 呼 び 出 し た プ ロ セ ス の カ レ ン ト ワ ー キ ン グ デ ィ レ ク ト リ か ら の 相 対 パ ス と 解 釈 さ れ る )。

dirp が 相 対 パ ス で dirfd が 特 別 な 値 AT_FDCWD の 場 合 、 dirp は (scandir() と 同 様 に ) 呼 び 出 し た プ ロ セ ス の カ レ ン ト ワ ー キ ン グ デ ィ レ ク ト リ か ら の 相 対 パ ス と 解 釈 さ れ る 。

dirp が 絶 対 パ ス の 場 合 、 dirfd は 無 視 さ れ る 。

scandirat() が 必 要 な 理 由 に つ い て は openat(2) を 参 照 す る こ と 。

返 り 値

scandir() 関 数 は 、 選 択 さ れ た デ ィ レ ク ト リ の エ ン ト リ ー 数 を 返 す 。 エ ラ ー の 場 合 、 −1 を 返 し 、 errno に エ ラ ー の 原 因 を 示 す 値 を 設 定 す る 。 関 数 alphasort() と versionsort() は 1 番 目 の 引 き 数 が 2 番 目 の 引 き 数 に 対 し て 、 [小 さ い /等 し い /大 き い ] か に 応 じ て 、 0 よ り [小 さ い /等 し い /大 き い ] 値 を 返 す 。

エ ラ ー

ENOENT

dirp で 指 定 さ れ た パ ス が 存 在 し な い 。

ENOMEM

操 作 を 完 了 す る の に 十 分 な メ モ リ ー が な い 。

ENOTDIR

dirp で 指 定 さ れ た パ ス が デ ィ レ ク ト リ で は な い 。

scandirat() で は 追 加 で 以 下 の エ ラ ー も 発 生 す る :

EBADF

dirfd が 有 効 な フ ァ イ ル デ ィ ス ク リ プ タ ー で は な い 。

ENOTDIR

dirp が 相 対 パ ス で 、 dirfd が デ ィ レ ク ト リ 以 外 の フ ァ イ ル を 参 照 し て い る フ ァ イ ル デ ィ ス ク リ プ タ ー で あ る 。

バ ー ジ ョ ン

versionsort() は 、 glibc バ ー ジ ョ ン 2.1 で 追 加 さ れ た 。

scandirat() は glibc バ ー ジ ョ ン 2.15 で 追 加 さ れ た 。

準 拠

alphasort(), scandir(): 4.3BSD, POSIX.1−2008.

versionsort() と scandirat() は GNU 拡 張 で あ る 。

注 意

glibc 2.1 以 降 で は alphasort() は strcoll(3) を 呼 び 出 す 。 alphasort() は 以 前 は strcmp(3) を 使 っ て い た 。

#define _SVID_SOURCE
/* カ レ ン ト デ ィ レ ク ト リ の フ ァ イ ル を 逆 順 に 出 力 す る */
#include <dirent.h>

int
main(void)
{
struct dirent **namelist;
int n;

n = scandir(".", &namelist, NULL, alphasort);
if (n < 0)
perror("scandir");
else {
while (n−−) {
printf("%s\n", namelist[n]−>d_name);
free(namelist[n]); }
free(namelist); } }

関 連 項 目

closedir(3), fnmatch(3), opendir(3), readdir(3), rewinddir(3), seekdir(3), strcmp(3), strcoll(3), strverscmp(3), telldir(3)

こ の 文 書 に つ い て

こ の man ペ ー ジ は Linux man−pages プ ロ ジ ェ ク ト の リ リ ー ス 3.79 の 一 部 で あ る 。 プ ロ ジ ェ ク ト の 説 明 と バ グ 報 告 に 関 す る 情 報 は http://www.kernel.org/doc/man−pages/ に 書 か れ て い る 。