как вычесть один путь из другого? - PullRequest
4 голосов
/ 17 апреля 2011

Итак ... У меня есть базовый путь и новый путь. Новый путь содержит в себе базовый путь. Мне нужно увидеть, что отличается на новом пути. Как у нас / home / и новый путь - / home / apple / one, и мне нужно получить от него apple / one. обратите внимание - когда я создам какой-либо путь из (homePath / diffPath), мне нужно получить его / home / apple / one еще раз. Как это сделать с помощью Boost FileSystem?

Ответы [ 2 ]

9 голосов
/ 18 апреля 2011

Используя 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;
}
0 голосов
/ 10 января 2016

Другое решение, если вы знаете, что newpath действительно принадлежит basepath, может быть:

auto nit = newpath.begin();

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

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