【问题标题】:How to combine two boost::filesystem::path's?如何结合两个 boost::filesystem::path 的?
【发布时间】:2017-07-09 15:46:07
【问题描述】:

我需要将绝对路径 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 是绝对路径时,我可以通过查看它并使用它来“看到”它,但我不想对前导 / 的检查进行硬编码,因为在 Windows 上它可能会有所不同(例如 @ 987654340@ 或 \\)。

【问题讨论】:

  • 查看 boost::filesystem::canonical 以获取没有 .和..我相信它也删除了额外的 /
  • /usr/home/ + /abc = /abc -- 这很不寻常 -- 标准化,我希望它变成/usr/home/abc
  • @DanMašek:一点也不稀奇。这基本上是任何接受文件名的程序所做的。给定一个绝对路径,它直接使用该路径。并给定一个相对路径,将其附加到当前工作目录。

标签: c++ boost boost-filesystem


【解决方案1】:

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(),它的作用正好相反。

【讨论】:

  • 谢谢。只是为了确定 - 没有这样做的功能吗?
  • @RustyX:我不知道。
  • @BenjaminLindley 我认为有一个更适合的函数(因为它处理root_names)。看我的回答
【解决方案2】:

如果您希望相对于某个目录(通常是当前工作目录)创建相对路径绝对路径,一个函数可以做到这一点:

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2016-06-02
      • 2012-07-06
      • 2011-11-07
      • 1970-01-01
      • 1970-01-01
      • 2011-01-24
      • 2011-04-23
      • 2018-02-18
      • 1970-01-01
      相关资源
      最近更新 更多