最直接的方法是用 std::string::rfind('.') 找最后一个点位置,再用 substr(pos+1) 提取后缀,需检查 pos 是否为 npos、是否为0或末尾;更安全的方案是用 std::filesystem::path::extension(),但要求 c++17 且需处理异常和路径合法性。

用 std::string 的 rfind 和 substr 提取后缀最直接
Windows 和 Linux 下路径分隔符不同,但后缀只跟最后一个 . 有关,和目录无关。只要从字符串末尾往前找第一个 .,就能拿到后缀——前提是文件名本身有 . 且不以 . 开头(比如 .gitignore 是合法文件,但后缀是 gitignore,不是空)。
实操建议:
- 先用
rfind('.')找最后出现的点位置,返回std::string::npos表示没找到 - 检查点是否在文件名主体内:位置必须大于 0(排除
.bashrc这种隐藏文件被误判为“空后缀”)且小于字符串长度减 1(排除file.这种末尾是点的情况) - 用
substr(pos + 1)截取,不用substr(pos),避免把点一起带上
std::string get_extension(const std::string& filename) {
size_t pos = filename.rfind('.');
if (pos == std::string::npos || pos == 0 || pos == filename.length() - 1)
return "";
return filename.substr(pos + 1);
}
用 std::filesystem::path 更安全,但要注意 C++17 支持和路径合法性
std::filesystem::path 自带 extension() 方法,会自动处理各种边界情况,比如 .profile、archive.tar.gz(默认只返回 .gz),但它依赖路径对象构造——如果传入非法路径(如空串、含
