extension() 返回原样字符串,故可能大写或为空;因纯解析路径末尾的.后内容,无文件存在性检查或大小写处理。

std::filesystem::path::extension() 本身不处理大小写,它只是原样返回扩展名(包括前面的 .),且行为依赖于路径字符串的实际内容——不是文件真实存在与否,也不是操作系统默认规则。
为什么 extension() 返回的扩展名可能带大写、甚至为空?
因为 extension() 是纯字符串解析:它从最后一个 . 开始截取到末尾,但有三个关键前提:
- 如果路径没有
.(如"file"),返回空path - 如果
.在末尾(如"file."),返回"." - 如果路径是目录形式(如
"dir/"或"dir\."),也可能返回空或异常结果 - 它完全不管文件是否真实存在,也不调用系统 API 做规范化
如何安全获取并转为小写扩展名?
必须组合使用 extension() + 手动清洗 + 大小写转换。推荐做法:
- 先用
path.filename().extension()(比直接p.extension()更鲁棒,跳过目录部分) - 检查返回值是否非空,且长度 > 1(排除
"."这种无效情况) - 用
std::tolower遍历每个字符转换,注意传入unsigned char防止符号扩展
示例代码:
std::filesystem
-
"FILE.TXT"→".TXT",不是".txt" -
"archive.tar.gz"→".gz"(只取最后一段),不是".tar.gz";若需多级扩展名,得自己实现逻辑 - 某些路径含备用数据流(
:zone.identifier)或特殊分隔符,extension()会误判,建议先用path.stem()+path.extension()搭配验证
真正容易被忽略的是:extension() 的语义和文件系统实际行为之间没有绑定关系——它不读磁盘、不查注册表、不看文件关联,只是一个基于字符串规则的切片工具。依赖它做类型判断前,务必加人工校验逻辑。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











