如何合并两个 boost::filesystem::path?

How to combine two boost::filesystem::path's?

我需要将绝对路径 A 与路径 B 结合起来,因为 B 可能是相对的也可能是绝对的,最好使用 boost::filesystem

换句话说,我想要:

前两个使用 / 运算符很容易,但我无法让第三个工作。

我试过了:

std::cout << boost::filesystem::path("/usr/home/") / "/abc";

打印 /usr/home//abc.

std::cout << boost::filesystem::path("/usr/home/") + "/abc";

仍然打印 /usr/home//abc.

当然,当路径 B 是绝对路径时,我可以 "see" 通过查看它并使用它,但我不想对前导 / 的检查进行硬编码,因为在 Windows 它可以不同(例如 C:\\)。

boost::filesystem::path有一个成员函数is_absolute()。因此,您可以基于此选择您的操作(连接或替换)。

path a = "/usr/home/";
path b = "/abc";
path c;

if (b.is_absolute())
    c = b;
else
    c = a / b;

还有is_relative(),正好相反

如果您希望将某个目录(通常是当前工作目录)的相对路径设为绝对路径, 有一个函数可以执行此操作:

您也可以使用 C++17 std::filesystem::path。它 operator/ 正是您所需要的。

// where "//host" is a root-name
path("//host")  / "foo" // the result is      "//host/foo" (appends with separator)
path("//host/") / "foo" // the result is also "//host/foo" (appends without separator)

// On POSIX,
path("foo") / ""      // the result is "foo/" (appends)
path("foo") / "/bar"; // the result is "/bar" (replaces)

// On Windows,
path("foo") / "C:/bar";  // the result is "C:/bar" (replaces)
path("foo") / "C:";      // the result is "C:"     (replaces)
path("C:") / "";         // the result is "C:"     (appends, without separator)
path("C:foo") / "/bar";  // yields "C:/bar"        (removes relative path, then appends)
path("C:foo") / "C:bar"; // yields "C:foo/bar"     (appends, omitting p's root-name)