一、简介
如何知道一个目录下的所有文件个数呢?Linux系统io函数为我们提供了目录操作函数。我们可以利用它来递归的读取目录,从而知道指定目录下有多少个文件。
二、函数接口
1、opendir函数
函数原型:
DIR *opendir(const char *name);
依赖头文件:
#include <sys/types.h>
#include <dirent.h>
作用:
打开一个目录。
返回值:
DIR结构体指针,(DIR类似于FILE结构体)保存了所打开的的目录信息;失败返回NULL。
2、readdir函数
函数原型:
struct dirent *readdir(DIR *dirp);
依赖头文件:
#include <dirent.h>
作用:
读目录。
返回值:
成功返回dirent结构体指针。失败返回NULL。 这里我们来仔细看看dirent结构体的组成:
struct dirent { long d_ino; /* inode number 索引节点号 */ off_t d_off; /* offset to this dirent 在目录文件中的偏移 */ unsigned short d_reclen; /* length of this d_name 文件名长 */ unsigned char d_type; /* the type of d_name 文件类型 */ char d_name [NAME_MAX+1]; /* file name (null-terminated) 文件名,最长255字符 */ }
3、closedir函数
函数原型:
int closedir(DIR *dirp);
依赖头文件:
#include <sys/types.h>
#include <dirent.h>
返回值:
成功返回0,失败返回-1。
三、实例代码
#include <dirent.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
long get_dir_number(char * filepath); //函数声明
int main(int argc, char *argv[])
{
if (argc<2)
{
printf("需要目录名。\n");
exit(1);
}
long nu = get_dir_number(argv[1]);
printf("%s目录下有%ld个文件。\n", argv[1], nu);
return 0;
}
long get_dir_number(char *filepath)
{
long FileNumber = 0; //存储文件个数
DIR *dir = opendir(filepath); //先打开文件
if (NULL == dir) //判断是否打开成功
{
perror("打开文件");
exit(1);
}
struct dirent *di; //dirent结构体指针,用于指向数据
char p_file[1024]; //用于拼接字符串。遇到子目录。
while ((di = readdir(dir)) != NULL)
{
//要忽略掉.和 .. 如果读到它们,就不要对他们操作。strcmp函数用于比较字符串,相等返回0;
if (strcmp(di->d_name, ".") == 0 || strcmp(di->d_name, "..") == 0)
{
continue;//忽略掉
}
else if (di->d_type == DT_DIR) //遇到目录就要进入,使用递归
{
sprintf(p_file, "%s / %s", filepath, di->d_name);
FileNumber += get_dir_number(p_file);//这里是+=
}
else //我这里是统计的所有文件,不管是什么类型的。可以自定义条件,统计不同类型的文件数目
{
FileNumber++;
}
}
closedir(dir);
return FileNumber;
}