【问题标题】:How to convert boost::filesystem::path with ".." (go up) components to proper path如何将带有“..”(向上)组件的 boost::filesystem::path 转换为正确的路径
【发布时间】:2013-06-12 10:12:53
【问题描述】:

如何将 boost::filesystem::path 转换为:

root/subdir1/subdir2/../some.file

到:

root/subdir1/some.file

可能有多个“升级”运算符?

【问题讨论】:

    标签: c++ boost boost-filesystem


    【解决方案1】:

    从 Boost 文件系统库中查看 canonical

    【讨论】:

    • 这似乎完全符合我的需要,但问题是“必须存在”部分。我希望能够先转换路径,然后再进行修改,然后才尝试打开文件/检查是否存在。 (这是我关于 SO 的第一个问题,所以不确定我应该在哪里添加此评论)
    • 如果路径不存在,那么在创建提升路径对象之前,您需要使用@ArneMertz 建议的一些字符串操作。我建议您通过示例详细说明您的问题,以获得更好的答案。
    • 我现在实际上是通过迭代路径“组件”(通过 path::begin()/end())手动完成,如果当前组件是“..”,则弹出最后一个组件。这实际上有效,但我想知道是否有来自 boost::filesystem 的直接支持。我接受你的回答。
    【解决方案2】:

    简短的问题,简短的回答:

    随后简单地删除路径中出现的每个/<dirname>/..。您可以轻松地使用正则表达式。

    【讨论】:

    • 删除“/..”会如何导致“上一层”?在我的示例中,这会错误地创建 root/subdir1/subdir2/some.file
    • 抱歉,没有意识到 SO 没有显示 <dirname>。对其进行了编辑,因此删除之前的/../<dirname> 将取消升级/降级
    【解决方案3】:

    为什么不使用 branch_path() ?它返回 boost::filesystem::path 的父目录

    例子:

     boost::filesystem::path path("root/subdir1/subdir2/some.file");
     boost::filesystem::path parent = path.branch_path().branch_path(); // "root/subdir1"
     boost::filesystem::copy(path, parent);
     boost::filesystem::remove(path.branch_path());
    

    你可以随心所欲地使用它。

    【讨论】:

      猜你喜欢
      • 2019-01-31
      • 2010-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多