在C语言的实际开发中,遍历目录并读取文件内容算是家常便饭了。你可能会想,这事儿到底有多简单?其实,只要用上dirent.h这个标准库,几行代码就能搞定。下面这个例子,就是用readdir函数遍历当前目录的经典写法——先过一眼,后面再细聊细节。

#include
#include
#include
#include
int main() {
DIR *dir;
struct dirent *entry;
// 打开当前目录
dir = opendir(".");
if (dir == NULL) {
perror("opendir");
return EXIT_FAILURE;
}
// 遍历目录中的每个条目
while ((entry = readdir(dir)) != NULL) {
printf("%s\n", entry->d_name);
}
// 关闭目录
closedir(dir);
return EXIT_SUCCESS;
}
代码说明
先拆开看看每个函数都在干什么:
opendir:它的任务就是打开一个目录流,返回一个指向DIR结构的指针。如果目录打不开——比如路径不存在或权限不够——它就返回NULL,这时候一定要检查错误。readdir:从目录流里一次读一个条目。每次调用它会返回一个指向dirent结构的指针,里面藏着文件名之类的信息。如果读到尽头了,它就返回NULL——这也是循环退出的条件。closedir:用完了得关上,不然会有资源泄漏。entry->d_name:这个字段就是目录项的名字,比如文件或子目录的名字。
注意事项
顺手提几个容易踩的坑:
readdir返回的dirent结构里其实还藏着其他信息,比如文件类型(entry->d_type)、文件大小等,不过这些字段在不同系统上不一定全有,用之前最好查一下文档。- 如果需要递归遍历子目录,那就在遇到子目录时再次调用
opendir和readdir套一层循环,实现起来并不复杂。 - 实际项目中经常需要对文件列表做过滤,比如只列出
.txt或.c文件,这时候可以结合strstr或正则表达式来处理。
上面这个例子只是简单地把当前目录下所有文件和子目录的名字打印出来。根据你的实际需求——比如读取文件内容、统计大小、或者做更复杂的操作——都可以在这个骨架基础上扩展。说到底,dirent.h这套接口就是C语言里与文件系统打交道的基础工具,掌握它,很多日常任务就能信手拈来。