导读:本期聚焦于小伙伴创作的《C++如何实现文件名的批量模式匹配?fnmatch通配符过滤实战教程》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《C++如何实现文件名的批量模式匹配?fnmatch通配符过滤实战教程》有用,将其分享出去将是对创作者最好的鼓励。

在C++项目开发中,批量处理文件时经常需要根据特定规则筛选文件名,比如筛选出所有日志文件、特定前缀的配置文件等。fnmatch是C标准库中提供的通配符匹配函数,支持常见的通配符规则,能够方便地实现文件名模式匹配需求,不需要开发者自己编写复杂的匹配逻辑。

C++如何实现文件名的批量模式匹配?fnmatch通配符过滤实战教程

fnmatch函数基本说明

fnmatch函数定义在<fnmatch.h>头文件中,它的作用是判断一个字符串是否符合指定的通配符模式。函数原型如下:

#include <fnmatch.h>
int fnmatch(const char *pattern, const char *string, int flags);

参数说明:

  • pattern:通配符模式字符串,支持星号*、问号?等通配符
  • string:需要匹配的字符串,这里通常是文件名
  • flags:匹配标志,常用的有FNM_NOESCAPE(禁用反斜杠转义)、FNM_PATHNAME(把斜杠当作普通字符处理)等

返回值:如果匹配成功返回0,不匹配返回FNM_NOMATCH,出错返回其他非零值。

常见通配符规则

fnmatch支持的通配符规则如下:

通配符说明示例
*匹配任意长度的任意字符,包括空字符模式*.txt匹配所有以txt结尾的文件名
?匹配单个任意字符模式file?.log匹配file1.log、fileA.log等
[abc]匹配方括号内的任意一个字符模式file[12].txt匹配file1.txt和file2.txt
[a-z]匹配指定范围内的任意一个字符模式log_[a-c].txt匹配log_a.txt、log_b.txt、log_c.txt

实战:批量文件名通配符过滤

下面通过一个完整的示例,演示如何遍历指定目录下的所有文件,使用fnmatch过滤出符合指定模式的文件名。

示例代码实现

首先包含需要的头文件,然后实现遍历目录和匹配过滤的逻辑:

#include <iostream>
#include <vector>
#include <string>
#include <fnmatch.h>
#include <dirent.h>
#include <cstring>

// 过滤符合模式的文件名
std::vector<std::string> filter_files_by_pattern(const std::string &dir_path, const std::string &pattern) {
    std::vector<std::string> matched_files;
    DIR *dir = opendir(dir_path.c_str());
    if (dir == nullptr) {
        std::cerr << "无法打开目录: " << dir_path << std::endl;
        return matched_files;
    }
    struct dirent *entry;
    while ((entry = readdir(dir)) != nullptr) {
        // 跳过.和..目录项
        if (strcmp(entry->d_name, ".") == 0 || strcmp(entry->d_name, "..") == 0) {
            continue;
        }
        // 使用fnmatch进行模式匹配
        int ret = fnmatch(pattern.c_str(), entry->d_name, 0);
        if (ret == 0) {
            matched_files.push_back(entry->d_name);
        } else if (ret != FNM_NOMATCH) {
            std::cerr << "fnmatch匹配出错" << std::endl;
        }
    }
    closedir(dir);
    return matched_files;
}

int main() {
    // 指定要遍历的目录,这里使用当前目录
    std::string dir_path = ".";
    // 指定匹配模式,这里匹配所有以.cpp结尾的文件
    std::string pattern = "*.cpp";
    
    std::vector<std::string> result = filter_files_by_pattern(dir_path, pattern);
    
    std::cout << "匹配到的文件名如下:" << std::endl;
    for (const auto &filename : result) {
        std::cout << filename << std::endl;
    }
    return 0;
}

代码说明

上述代码首先实现了filter_files_by_pattern函数,该函数接收目录路径和匹配模式作为参数,遍历目录下的所有文件,使用fnmatch函数判断文件名是否符合模式,将符合的文件名存入向量返回。主函数中调用该函数,匹配当前目录下所有以cpp结尾的文件并输出结果。

注意事项

  • fnmatch是C标准库函数,在C++中使用时需要包含<fnmatch.h>头文件,不同平台的实现可能略有差异,但核心功能一致
  • 遍历目录使用了opendirreaddir等POSIX标准函数,在Windows平台下可能需要使用不同的目录遍历接口,或者安装MinGW等环境支持POSIX函数
  • 如果文件名包含中文等多字节字符,需要确保编码一致,避免出现匹配错误
  • 匹配模式中的反斜杠默认是转义字符,如果需要匹配字面反斜杠,可以设置FNM_NOESCAPE标志,或者在模式中写两个反斜杠
fnmatch函数适合简单的通配符匹配场景,如果需要更复杂的匹配规则,比如正则表达式匹配,可以考虑使用C++11之后的<regex>标准库。

C++fnmatch通配符匹配文件名过滤批量处理修改时间:2026-07-21 06:00:25

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。