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

C++ std::filesystem 获取不带点文件扩展名的其他方法

可行实现方案

首先明确:C++标准库的std::filesystem::path目前没有内置直接返回不带点扩展名的接口,你可以用以下几种更安全、更简洁的方式实现:

1. 基础安全写法(兼容所有支持C++17的版本)

你原来的写法没有处理文件无扩展名的边界场景:如果文件本身没有扩展名(比如"Makefile"、"README"),p.extension()会返回空字符串,此时调用substr(1)会触发std::out_of_range异常。优化后写法如下:

// 如果需要返回path类型
fs::path get_ext_without_dot(const fs::path& p) {
    auto ext_str = p.extension().string();
    return ext_str.empty() ? "" : ext_str.substr(1);
}

// 如果只需要字符串结果,不需要path类型,可直接返回string
std::string get_ext_str(const fs::path& p) {
    auto ext_str = p.extension().string();
    return ext_str.empty() ? "" : ext_str.substr(1);
}

2. C++20 简化写法

如果你使用C++20及以上版本,可以用starts_with方法让逻辑更清晰:

std::string get_ext_str(const fs::path& p) {
    auto ext = p.extension().string();
    return ext.starts_with('.') ? ext.substr(1) : ext;
}

3. 无需额外函数的一行写法

如果确认业务场景下所有目标文件都一定有扩展名,不需要处理边界,也可以直接简化为:

// 不需要构造path的场景
std::string ext = p.extension().string().substr(1);

// 需要构造path的场景
fs::path ext_path = p.extension().string().substr(1);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.13 07:00:04