5

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

4

3 回答 3

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;
}
于 2011-04-18T14:10:53.180 回答
1

假设你有:

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"or base = "home/usera/"。如果full不包含base,这可能会给你一个很长的路径,..而不是得到一个错误。

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

于 2021-02-08T10:04:46.410 回答
0

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

auto nit = newpath.begin();

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

fs::path = path(nit, newpath.end());
于 2016-01-10T19:40:10.717 回答