scandir, 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 void *a, const void *b);
int versionsort(const void *a, const void *b);
glibc 向 け の 機 能 検 査 マ ク ロ の 要 件 (feature_test_macros(7) 参 照 ):
scandir(),
alphasort(): _BSD_SOURCE || _SVID_SOURCE
versionsort(): _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) を 用 い る 。
関 数 scandir() は 選 択 さ れ た エ ン ト リ の 数 か 、 (エ ラ ー が 発 生 し た 場 合 ) −1 を 返 す 。 関 数 alphasort() と versionsort() は 1 番 目 の 引 き 数 が 2 番 目 の 引 き 数 に 対 し て 、 [小 さ い /等 し い /大 き い ] か に 応 じ て 、 0 よ り [小 さ い /等 し い /大 き い ] 値 を 返 す 。
|
ENOMEM 動 作 を 完 遂 す る に は メ モ リ が 足 り な い 。 |
versionsort() は 、 glibc バ ー ジ ョ ン 2.1 で 追 加 さ れ た 。
alphasort() と scandir() は POSIX.1-2008 で 規 定 さ れ て お り 、 広 く 利 用 可 能 で あ る 。 versionsort() は GNU 拡 張 で あ る 。 関 数 scandir() と alphasort() は 4.3BSD か ら 取 り 入 れ ら れ 、 Linux で は libc4 か ら 使 用 可 能 に な っ た 。 libc4 と libc5 で は 以 下 の よ う な も っ と 詳 細 な プ ロ ト タ イ プ を 使 っ て い る 。
int
alphasort(const struct dirent ** a,
const struct dirent **b); し か し glibc
2.0 で は 不 正 確 な
BSD の プ ロ ト タ イ
プ に 戻 っ た 。
関 数 versionsort() は GNU の
拡 張 で あ り 、 glibc
2.1 以 降 で 使 用 可
能 で あ る 。
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, 0, 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)