【问题标题】:how to subtract one path from another?如何从另一条路径中减去一条路径?
【发布时间】:2011-04-17 16:22:05
【问题描述】:

所以...我有一个基本路径和一个新路径。新路径包含基本路径。我需要看看新路径有什么不同。就像我们有 /home/ 一样,新路径是 /home/apple/one,我需要从中获取 apple/one。注意 - 当我从 (homePath/diffPath) 创建一些路径时,我需要再次获取 /home/apple/one。如何用 Boost FileSystem 做这样的事情?

【问题讨论】:

    标签: c++ boost boost-filesystem


    【解决方案1】:

    使用 stem() 和 parent_path() 并从新路径向后走,直到我们回到基本路径,这可行,但我不确定它是否非常安全。 请小心,因为路径“/home”和“/home/”被视为不同的路径。以下仅在基本路径为 /home(不带斜杠)且新路径保证在目录树中的基本路径下方时有效。

    #include <iostream>
    #include <boost/filesystem.hpp>
    int main(void)
    {
      namespace fs = boost::filesystem;
    
      fs::path basepath("/home");
      fs::path newpath("/home/apple/one");
      fs::path diffpath;
    
      fs::path tmppath = newpath;
      while(tmppath != basepath) {
        diffpath = tmppath.stem() / diffpath;
        tmppath = tmppath.parent_path();
      }
    
      std::cout << "basepath: " << basepath << std::endl;
      std::cout << "newpath: " << newpath << std::endl;
      std::cout << "diffpath: " << diffpath << std::endl;
      std::cout << "basepath/diffpath: " << basepath/diffpath << std::endl;
    
      return 0;
    }
    

    【讨论】:

    • 使用while(!fs::equivalent(tmppath,basepath)) 比使用while(tmppath != basepath) 更健壮。
    【解决方案2】:

    假设你有:

    namespace fs = std::filesystem; // or boost::filesystem
    
    fs::path base = "/home/usera"
    fs::path full = "/home/usera/documents/doc"
    

    如果要提取documents/doc,可以使用lexically_relative

    fs::path diff = full.lexically_relative(base);
    assert( diff == fs::path("documents/doc") );
    

    这适用于base = "/home/usera"base = "home/usera/"。如果full 不包含base,这可能会给您一个包含大量.. 的相当长的路径,而不是出现错误。

    std::filesystem::path::lexically_relative 需要 C++17

    【讨论】:

      【解决方案3】:

      其他解决方案,如果你知道newpath确实属于basepath,可能是:

      auto nit = newpath.begin();
      
      for (auto bit = basepath.begin(); bit != basepath.end(); ++bit, ++nit)
          ;
      
      fs::path = path(nit, newpath.end());
      

      【讨论】:

        猜你喜欢
        • 2011-12-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-04-22
        • 2014-05-05
        • 1970-01-01
        相关资源
        最近更新 更多