boost::filesystem与std::filesystem的operator/行为差异及适配方案
boost::filesystem迁移至std::filesystem的operator/行为差异问题解答
问题描述
迁移代码时发现boost::filesystem::path和std::filesystem::path的operator/运算符行为不一致,测试代码运行后std版本输出"\\",与boost版本输出"\FooBar\"、以及预期结果不符。
差异原因
两类路径的拼接逻辑对绝对路径右操作数的处理规则不同:
std::filesystem严格遵循C++标准要求:如果operator/的右操作数是绝对路径,运算结果直接等于右操作数,不会与左路径拼接。测试代码中最后一步拼接的sep是单个反斜杠,在Windows平台下属于绝对路径,因此start / "FooBar" / "\\"的结果就是"\\",符合观测到的输出。boost::filesystem未实现该标准逻辑,无论右操作数是否为绝对路径,都会直接将路径片段追加到左路径之后,因此输出符合预期。
适配方案
可通过relative_path()方法剥离右操作数的绝对路径属性,模拟boost的拼接逻辑,示例如下:
#include <iostream> #include <filesystem> namespace fs = std::filesystem; int main(int argc, char** argv) { fs::path foo = "\\foo"; fs::path bar = "\\bar"; auto foobar0 = foo / bar; // 运算结果为 \\bar auto foobar1 = foo / bar.relative_path(); // 运算结果为 \\foo\\bar }
内容的提问来源于stack exchange,提问作者Dundo
相关产品推荐
相关产品推荐

