利用目录函数(opendir,readdir,closedir)查找文件个数
如何知道一个目录下的所有文件个数呢?或许可以用tree来学(zhuang)习(bi)的同时知道文件个数。Linux系统io函数为我们提供了目录操作函数,其中有一个比较重要(实际上有三个,因为它们经常配套使用。)。我们可以利用它来递归的读取目录,从而知道指定目录下有多少个文件。下面我来介绍一下:
opendir函数:
函数原型:DIR *opendir(const char *name);
依赖头文件: #include <sys/types.h> #include <dirent.h>
作用:打开一个目录。
返回值:DIR结构体指针,(DIR类似于FILE结构体)保存了所打开的的目录信息;失败返回NULL。
readdir函数:
函数原型:struct dirent *readdir(DIR *dirp);
依赖头文件:#include <dirent.h>
作用:读目录。
返回值:成功返回dirent结构体指针。失败返回NULL。这里我们来仔细看看dirent结构体的组成:
closedir:
函数原型:int closedir(DIR *dirp);
依赖头文件:#include <sys/types.h> #include <dirent.h>
返回值:成功返回0,失败返回-1。
接下来我们开始编码:
我们先定义一个函数:long get_dir_number(char * filepath)
下面是它的内容:
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)
{
//要忽略掉.和 .. 如果读到它们,就不要对他们操作。
if (strcmp(di->d_name, ".") == 0 || strcmp(di->d_name, "..") == 0)
//strcmp函数用于比较字符串,相等返回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;
}
挺简单的。现在来看主函数:
#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;
}
就这样,统计文件数目的小程序就完成了。