opendir、readdir以及使用
opendir,打开一个目录。
函数原型:DIR *opendir(const char *name)
DIR *fopendir(int fd)
DIR是一个结构指针,是一个内部结构,保存所打开的目录信息。函数出错返回NULL
readdir,读目录 ,<dirent.h>
函数原型:struct dirent *readdir(DIR *dirp); //返回一条记录项(文件或目录)
int readdir_r(DIR *dirp, struct dirent *entry, struct dirent **result);
struct dirent
{
ino_t d_ino; //此目录进入点的inode
ff_t d_off; //目录文件开头至此目录进入点的位移
signed short int d_reclen; //d_name 的长度,不包含NULL
unsigned char d_type; //d_name 所指的文件类型
har d_name[256]; //文件名
}
递归获取文件个数
#include <dirent.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
int getFileNum(char *root)
{
//open dir
DIR* dir = NULL;
dir = opendir(root);
if(dir == NULL)
{
perror("opendir");
exir(1);
}
//遍历当前打开的目录
struct dirent* ptr = NULL;
char path[1024] ={0};
int total = 0;
while(ptr = readdir(dir) != NULL)
{
//过滤. 和 ..
if(strcmp(ptr->d_name, ".") == 0 || strcmp(ptr->d_name, "..") == 0)
{
continue;
}
if(ptr->d_type == DT_DIR)
{
//递归 读目录
sprintf(path, "%s/%s", root, ptr->d_name);
total += getFileNum(path);
}
//如果是普通文件
if(ptr->d_type == DT_REG)
{
total++;
}
}
//还需要关闭目录
closedir(dir);
return total;
}
int main(int argc, char *argv[])
{
if(argc < 2)
{
printf("./a.out dir\n");
exit(1);
}
int total = getFileNum(argv[1]);
printf("%s has file numbers %d\n", argv[1], total);
return 0;
}