Linux路径斜杠规范化及std::filesystem::path原生分隔符推荐用法咨询
在std::filesystem::path中指定原生分隔符的推荐方式
为什么你的示例中make_preferred()没生效?
std::filesystem::path内部会自动识别路径中的分隔符:在Windows系统中,/和\都会被当作有效路径分隔符;在类Unix系统中,只有/是分隔符,\会被视为普通文件名字符。
你的示例输入"/tmp\\foo"在Windows上会被path解析为tmp目录下的foo,内部已经把/和\统一处理为分隔符。调用make_preferred()只是将所有内部存储的分隔符转换为当前系统的原生分隔符(Windows是\,类Unix是/),但你的输入中已经包含\,所以输出看起来没有变化。如果输入是纯/分隔的路径(比如"/tmp/foo"),调用make_preferred()后就会全部转为\。
推荐的处理方式
不需要用std::replace手动替换分隔符,std::filesystem已经提供了更优雅的解决方案:
- 跨平台代码优先用通用分隔符:直接用
/作为分隔符构造path对象,path会自动适配当前系统的原生分隔符。输出时:- 用
path.string()获取原生分隔符格式的字符串; - 用
path.generic_string()获取通用/分隔的字符串。
- 用
- 明确构造原生分隔符路径:针对特定系统编写代码时,使用对应系统的原生分隔符字面量,比如Windows用原始字符串字面量
R"(C:\tmp\foo)",类Unix系统用"/tmp/foo"。 - 强制统一为原生分隔符:如果需要确保path对象内部存储的是原生分隔符,调用
make_preferred()即可——它会修改path对象本身,将所有分隔符替换为原生格式。
修正示例
#include <filesystem> #include <iostream> #include <string> namespace fs = std::filesystem; int main() { // 用通用分隔符构造路径 std::string str = "/tmp/foo"; fs::path path(str); std::cout << "通用格式: " << path.generic_string() << std::endl; std::cout << "原生格式: " << path.string() << std::endl; // 强制转换为原生分隔符(修改path对象) path.make_preferred(); std::cout << "make_preferred后: " << path.string() << std::endl; return 0; }
Windows系统下输出:
通用格式: /tmp/foo 原生格式: \tmp\foo make_preferred后: \tmp\foo
类Unix系统下输出:
通用格式: /tmp/foo 原生格式: /tmp/foo make_preferred后: /tmp/foo
内容的提问来源于stack exchange,提问作者LarsA
相关产品推荐
相关产品推荐

