Linux环境下C++14如何从文件路径中提取父文件夹名称
C++14 Linux环境提取路径父文件夹名称实现
你已经定位到了文件名前的最后一个路径分隔符,只需要往前回溯找到上一个分隔符,截取两个分隔符中间的子串即可,注意处理路径末尾带斜杠、根目录文件、无层级相对路径这些边界场景。
完整实现代码
#include <string> std::string getFolderName(const std::string &path) { if (path.empty()) { return ""; } // 先清除路径末尾连续的分隔符,兼容路径末尾带/的输入 size_t valid_end = path.find_last_not_of("/\\"); if (valid_end == std::string::npos) { return "/"; } std::string trim_path = path.substr(0, valid_end + 1); // 定位文件/当前目录前的最后一个分隔符 size_t last_sep_pos = trim_path.find_last_of("/\\"); if (last_sep_pos == std::string::npos) { return ""; } if (last_sep_pos == 0) { return "/"; } // 往前找上一级分隔符 size_t prev_sep_pos = trim_path.find_last_of("/\\", last_sep_pos - 1); if (prev_sep_pos == std::string::npos) { return trim_path.substr(0, last_sep_pos); } return trim_path.substr(prev_sep_pos + 1, last_sep_pos - prev_sep_pos - 1); }
测试验证
- 输入示例路径
/home/abc/fi.mp4,返回结果为abc,符合预期 - 输入根目录文件路径
/test.txt,返回结果为/ - 输入相对路径
doc/note.pdf,返回结果为doc - 输入末尾带斜杠的目录路径
/home/abc/,返回结果为home(即abc目录的父文件夹名) - 输入多层级路径
/data/media/2024/01/demo.mov,返回结果为01
补充说明
纯Linux环境下路径分隔符只有正斜杠/,可以把代码里匹配反斜杠\\的逻辑删掉,减少无意义的匹配判断。如果后续升级到C++17,可以直接用标准库std::filesystem::path的parent_path()接口实现,不需要手动写字符串处理逻辑。
内容的提问来源于stack exchange,提问作者KimHee
相关产品推荐
相关产品推荐

