如何合并两个 boost::filesystem::path?
How to combine two boost::filesystem::path's?
我需要将绝对路径 A 与路径 B 结合起来,因为 B 可能是相对的也可能是绝对的,最好使用 boost::filesystem。
换句话说,我想要:
/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";
仍然打印 /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)
我需要将绝对路径 A 与路径 B 结合起来,因为 B 可能是相对的也可能是绝对的,最好使用 boost::filesystem。
换句话说,我想要:
/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";
仍然打印 /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)