如何将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
相关产品推荐
相关产品推荐

