标签:blog http io os ar 使用 sp strong 文件
scandir, alphasort, versionsort - 为寻找项目扫描目录
#include <dirent.h> int scandir(const char *dirp, struct dirent ***namelist,
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() 返回非零项目保存在一个通过malloc(3) 分配的缓存区里,再通过比较函数是compar() 的qsort(3) 函数排序,最后收集在namelist 的数组里,这个数组也是通过malloc(3) 分配的。如果filter 是 NULL,所有项目都被选择。
alpthasort() 和 versionsort() 可以用作比较函数 compar()。前者通过strcoll(3) 来排序项目,后者使用字符串字段(*a)->d_name 和(*b)->d_name 上应用 strverscmp(3)。
scandir() 函数返回被选择的目录条数,或者如果出错返回 -1。
alphasort() 和 versionsort() 函数返回一个小于、等于或大于零的整数,当第一个参数被认为是小于、等于或大于第二个参数时。
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);之前的调用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); } } --------------------------------------------------2
标签:blog http io os ar 使用 sp strong 文件
原文地址:http://www.cnblogs.com/ZXNblog/p/4067078.html