int scandir(const char *dirp, //传入参数,目录的绝对路径传进去
struct dirent ***namelist, //传出参数,传出一个dirent结构体的二级指针
int (*filter)(const struct dirent *), //一个过滤函数
int (*compar)(const struct dirent **, const struct dirent **)); //一个比较函数
1.struct dirent ***namelist
传出参数,传出一个二级指针,首先理解这个二级指针的意思:
- 一个一级指针 struct dirent *dir,可以指向一个struct dirent结构体,一个结构体可以描述一个文件的信息(inode、Name)
- 一个二级指针可以理解为 struct dirent *dir[10],就是有十个struct dirent指针,指向十个struct dirent结构体,可以描述十个文件的信息
- 我们需要的是一个目录里的文件(包括目录,目录也是一个文件)信息,而文件的个数肯定不是一个,并且我们不知道目录中有多少个文件,所以我们不能事先向上面一样分配好多少个struct dirent *dir结构体,只能在函数中分配空间,把分配了空间的地址传出来。
- 如上所述,我们需要的是一个struct dirent **dir,所以传入参数应为一个三级指针,struct dirent ***dir.
- 如图
2.int (*filter)(const struct dirent *)过滤函数
每次从目录文件中读取一个目录结构后便将此结构体(struct dirent)传给参数select所指的函数, select函数若不想要将此目录结构复制到namelist数组就返回0,若select为空指针则代表将所有目录结构体全都放到传进来的数组里。
3. int (*compar)(const struct dirent **, const struct dirent **)
scandir()会调用qsort()来排序数据,参数compar则为qsort()的参数,若是要排列目录名称字母则可使用alphasort
4.manpage的示例
#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]); //在scandir中malloc的,这里释放的是第几个struct dirent结构体
}
free(namelist); //这里释放的是 struct dirent *dir这个指针数组的空间
}
}