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"またはで機能しbase = "home/usera/"ます。fullが含まれていない場合、エラーが発生する代わりに、base多くのパスが含まれる可能性があります。..

std::filesystem::path::lexically_relativeC++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 に答える