如何结合两个boost :: filesystem :: path' s?

时间:2017-07-09 15:46:07

标签: c++ boost boost-filesystem

我需要将绝对路径A与路径B组合,假设B可以是相对的也可以是绝对的,最好使用boost::filesystem

换句话说,我希望:

  • <%= csrf_meta_tags %> <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %> <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %> + /usr/home/ = abc
  • /usr/home/abc + /usr/home/ = ../abc(或更好/usr/home/../abc - 这是我的问题
  • /usr/abc + /usr/home/ = /abc

/abc运营商可以很容易地使用前两个运算符,但我无法让第三个运算符运行。

我试过了:

/

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

/usr/home//abc

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

当然我可以&#34;看&#34;当路径B是绝对的,通过查看并使用它,但我不想对前导/usr/home//abc的检查进行硬编码,因为在Windows上它可能是不同的(例如/或{ {1}})。

3 个答案:

答案 0 :(得分:4)

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(),反其道而行之。

答案 1 :(得分:2)

如果你想要建立一个相对于某个目录(通常是当前工作目录)的绝对路径,那么 是一个执行此操作的函数:

答案 2 :(得分:1)

您还可以使用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)