我需要将绝对路径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}})。
答案 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)