利用目录函数(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;
}
就这样,统计文件数目的小程序就完成了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?