相关函数:open, readdir, closedir, rewinddir, seekdir, telldir, scandir
头文件:#include <sys/types.h> #include <dirent.h>
定义函数:DIR * opendir(const char * name);
函数说明:opendir()用来打开参数name 指定的目录, 并返回DIR*形态的目录流, 和open()类似, 接下来对目录的读取和搜索都要使用此返回值.
返回值:成功则返回DIR* 型态的目录流, 打开失败则返回NULL.
错误代码:
1、EACCESS 权限不足。
2、EMFILE 已达到进程可同时打开的文件数上限。
3、ENFILE 已达到系统可同时打开的文件数上限。
4、ENOTDIR 参数name 非真正的目录。
5、ENOENT 参数name 指定的目录不存在, 或是参数name 为一空字符串。
6、ENOMEM 核心内存不足。
示例:
int get_file_count(char *dir_name)
{
DIR *dir;
struct dirent * ptr;
int total = 0;
char path[MAX];
dir = opendir(root); /* 打开目录*/
if (dir == NULL) {
perror("fail to open dir");
exit(1);
}
errno = 0;
while ((ptr = readdir(dir)) != NULL) {
//顺序读取每一个目录项;
//跳过“..”和“.”两个目录
if (strcmp(ptr->d_name,".") == 0 || strcmp(ptr->d_name,"..") == 0) {
continue;
}
//printf("%s%s/n",root,ptr->d_name);
//如果是目录,则递归调用 get_file_count函数
if(ptr->d_type == DT_DIR) {
sprintf(path,"%s%s/",root,ptr->d_name);
//printf("%s/n",path);
total += get_file_count(path);
}
if(ptr->d_type == DT_REG) {
total++;
printf("%s%s/n",root,ptr->d_name);
}
}
if (errno != 0) {
printf("fail to read dir"); //失败则输出提示信息
exit(1);
}
closedir(dir);
return total;
}
int main(int argc, char * argv[])
{
int total;
if(argc != 2)
{
printf("wrong usage/n");
exit(1);
}
total = get_file_count(argv[1]);
printf("%s ha %d files/n",argv[1],total);
return 0;
}