如何使用readdir实现文件搜索
通过递归遍历目录并调用readdir读取条目,跳过“.”和“..”,对文件使用strstr进行子串匹配,可实现基于文件名的搜索功能。主函数接收路径和模式参数,递归函数处理目录与文件,编译后即可使用。
要在C语言中使用readdir实现文件搜索功能,核心思路是通过递归遍历目录,逐一匹配文件名。下面将详细介绍实现步骤。

准备工作:必要的头文件
首先需要包含以下头文件,它们分别提供标准输入输出、通用工具、目录操作和字符串处理功能。
#include
#include
#include
#include
这些头文件是C语言开发中常用的基础组件,缺少任何一个都会导致编译失败。
核心递归函数:search_files
接下来编写一个递归函数search_files,它能够进入每个子目录,并根据指定的文件名模式进行匹配。需要注意,遍历目录时必须跳过.和..两个特殊条目,否则会陷入无限递归。
void search_files(const char *path, const char *filename_pattern) {
DIR *dir;
struct dirent *entry;
char full_path[PATH_MAX];
dir = opendir(path);
if (dir == NULL) {
perror("opendir");
return;
}
while ((entry = readdir(dir)) != NULL) {
if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) {
continue;
}
snprintf(full_path, sizeof(full_path), "%s/%s", path, entry->d_name);
if (entry->d_type == DT_DIR) {
// 如果是目录,递归进入
search_files(full_path, filename_pattern);
} else {
// 如果是文件,检查文件名是否包含模式
if (strstr(entry->d_name, filename_pattern) != NULL) {
printf("Found: %s\n", full_path);
}
}
}
closedir(dir);
}
函数的执行流程很清晰:打开目录,逐个读取条目,判断条目类型。目录则递归调用自身,文件则使用strstr进行子串匹配。例如传入".txt",就会找出所有文件名中包含.txt的文件。如果需要支持通配符(如*.txt),则需要额外编写通配符匹配函数,此处不展开讨论。
主函数:调用入口
主函数负责接收命令行参数:搜索路径和文件名模式。如果参数数量不正确,则打印用法提示。
int main(int argc, char *argv[]) {
if (argc != 3) {
printf("Usage: %s \n", argv[0]);
return 1;
}
search_files(argv[1], argv[2]);
return 0;
}
使用方法为:./search_files /path/to/search ".txt",程序会递归搜索所有包含.txt的文件,并输出完整路径。
编译运行
需要注意的是,不同系统对d_type字段的支持情况不同(例如某些文件系统不支持该字段)。如果遇到问题,可以改用stat函数替代。但在绝大多数Linux环境下,该代码可以直接编译运行。编译与运行示例如下:
gcc search_files.c -o search_files
./search_files /path/to/search ".*.txt"
这里需要提醒:如果传入的模式是".*",strstr会匹配所有文件名(因为任意文件都包含连续字符),结果可能不符合预期。实际使用中建议使用简单的子串,例如"txt"来搜索文本文件。
通过以上代码,一个轻量且实用的文件搜索工具就完成了。核心思路包括递归遍历、目录过滤和名字匹配。在掌握基础功能后,还可以扩展添加深度限制、忽略隐藏目录等特性。
