如何使用readdir实现文件搜索

作者:技术拾光时间:2026-06-03 15:26:08浏览:659

通过递归遍历目录并调用readdir读取条目,跳过“.”和“..”,对文件使用strstr进行子串匹配,可实现基于文件名的搜索功能。主函数接收路径和模式参数,递归函数处理目录与文件,编译后即可使用。

要在C语言中使用readdir实现文件搜索功能,核心思路是通过递归遍历目录,逐一匹配文件名。下面将详细介绍实现步骤。

如何使用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"来搜索文本文件。

通过以上代码,一个轻量且实用的文件搜索工具就完成了。核心思路包括递归遍历、目录过滤和名字匹配。在掌握基础功能后,还可以扩展添加深度限制、忽略隐藏目录等特性。