You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将std::filesystem::path转为小写实现扩展名不区分大小写匹配?

实现大小写不敏感的文件扩展名匹配

首先纠正你代码里的语法错误:
原代码中const std::filesystem::path = script_file_extension("dsf");变量声明顺序错误,且扩展名需要包含前缀点(因为std::filesystem::path::extension()返回的是带点的后缀,比如.DSF),正确写法应为:

const std::filesystem::path script_file_extension(".dsf");

回到你的问题:不是必须把扩展名提取为std::string再转小写,但要实现跨平台的大小写不敏感匹配,有几种简洁的实现方式:

方式1:直接使用大小写不敏感的字符串比较函数

写一个轻量的辅助函数,直接逐字符做大小写不敏感对比,无需额外转换存储:

#include <filesystem>
#include <iostream>
#include <cctype>

// 仅针对ASCII字符的大小写不敏感比较
bool iequals(const std::string& a, const std::string& b) {
    if (a.size() != b.size()) return false;
    for (size_t i = 0; i < a.size(); ++i) {
        if (std::tolower(static_cast<unsigned char>(a[i])) != std::tolower(static_cast<unsigned char>(b[i]))) {
            return false;
        }
    }
    return true;
}

int main() {
    const std::string target_ext = ".dsf";
    for (const auto& dir_entry : std::filesystem::directory_iterator{"C:/Scripts"}) {
        if (dir_entry.is_regular_file()) {
            const auto ext_str = dir_entry.path().extension().string();
            if (iequals(ext_str, target_ext)) {
                std::cout << "Found script file: " << dir_entry.path() << "\n";
            }
        }
    }
    return 0;
}

方式2:转换扩展名到小写后比较(代码极简)

如果追求代码量最少,直接用std::transform把扩展名转成小写,再和目标小写扩展名对比,核心判断逻辑非常简洁:

#include <filesystem>
#include <iostream>
#include <algorithm>
#include <string>

int main() {
    const std::string target_ext = ".dsf";
    for (const auto& dir_entry : std::filesystem::directory_iterator{"C:/Scripts"}) {
        if (dir_entry.is_regular_file()) {
            std::string ext = dir_entry.path().extension().string();
            std::transform(ext.begin(), ext.end(), ext.begin(),
                           [](unsigned char c){ return std::tolower(c); });
            if (ext == target_ext) {
                std::cout << "Found script file: " << dir_entry.path() << "\n";
            }
        }
    }
    return 0;
}

平台注意事项

  • 若仅在Windows平台运行,Windows文件系统本身大小写不敏感,直接写file_path.extension() == ".dsf"也能匹配.DSF、.dSf等,但这种写法不跨平台(Linux/macOS文件系统是大小写敏感的)。
  • 上述两种方式均为跨平台实现,适合需要兼容多系统的场景。

内容的提问来源于stack exchange,提问作者Thomas Matthews

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 00:12:45