C++17 是跨平台路径处理最可靠方式,自动适配分隔符、大小写和根表示;推荐用 / 拼接、lexically_normal() 规范化、absolute() 或 weakly_canonical() 转绝对路径;需注意编译器支持与链接要求。
用 C++17 的 库是跨平台处理文件路径最可靠的方式,它自动适配不同系统的路径分隔符、大小写规则和根表示法,无需手动拼接或条件编译。
std::filesystem::path 会根据运行平台自动选择 /(Linux/macOS)或 \\(Windows),用 / 拼接路径是安全且推荐的写法,库内部会转换:
fs::path p = "data" / "config.txt"; → Windows 下生成 "data\\config.txt",Linux 下为 "data/config.txt"
std::string、std::wstring 构造,Windows 上宽字符可正确处理 Unicode 路径+ 或 += 拼接字符串,易出错;始终用 / 运算符或 .append()
不同系统对 ..、.、重复分隔符等处理不一致,lexically_normal() 和 absolute() 可统一行为:
p.lexically_normal() 消除冗余(如 "a/../b/./c" → "b/c"),不访问文件系统fs::absolute(p) 返回从当前工作目录出发的绝对路径(需确保路径存在或使用 fs::weakly_canonical() 处理不存在路径)absolute() 在 Windows 上会补全驱动器盘符(如 "file.txt" → "C:\\work\\file.txt")用标准接口替代平台相关宏或函数,避免 #ifdef _WIN32:
p.has_root_name()、p.has_root_directory()、p.has_filename() 精确识别路径结构fs::exists(p)、fs::is_directory(p)、fs::is_regular_file(p) 封装了底层 stat/fstat 调用fs::create_directories(p)(自动创建多级),删除用 fs::remove_all(p)
不是所有环境都默认启用 filesystem,需确认编译配置:
libfilesystem(VS2019+ 默认支持,旧版需手动加库)-lstdc++fs(GCC 13 起已整合进 libstdc++)find_package(Threads REQUIRED); target_link_libraries(... ${CMAKE_THREAD_LIBS_INIT})(部分实现依赖线程库)