如何从另一条路径中减去一条路径?

时间:2011-04-17 16:22:05

标签: c++ boost boost-filesystem

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

3 个答案:

答案 0 :(得分:9)

使用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;
}

答案 1 :(得分:0)

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

auto nit = newpath.begin();

for (auto bit = basepath.begin(); bit != basepath.end(); ++bit, ++nit)
    ;

fs::path = path(nit, newpath.end());

答案 2 :(得分:0)

假设您有:

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