2014-01-12 4 views
5

私は2つのディレクトリを比較しようとしていて、どのファイルが異なっているかを調べていますの中にあります。そこで私はboost::filesystem::recursive_directory_iteratorを使って各ディレクトリの内容をそれぞれのベクトルに追加しています。次に、各ベクトルをアルファベット順にソートし、パスの比較を開始します。これらのパスを比較しているC++:boost :: filesystemのパスを比較すると、最初のディレクトリパスを無視するにはどうすればよいですか?

バージョン1 /資産/ INFO.TXT

バージョン2 /資産/ INFO.TXT

:問題は、それが「ベース」のパスを含めてだと私は、という例たくないです違うが、私は彼らに同じものを比較してもらいたい。明確にするために、私はまだバイナリをチェックしていません。これまでのパス名だけです。私はこのようにそれらを比較することがしたい:

/Assets/info.txt

私は数時間のためにブーストのドキュメントをブラウズしてきたと私は私の問題のためのエレガントな解決策が存在する必要があります確信しています。しばらく前に、私が望むものの部分文字列を得ることでこれを解決できたことは分かっていますが、それほど醜い方法はないでしょう。

+0

substringメソッドがありますおそらくあなたの最高の賭け。 2つのディレクトリツリーを比較するときに行うことです。 –

答えて

6

boost::filesystem::recursive_directory_iteratorには、照会できるpath()プロパティがあります。その後、手動で比較するのパスを構築するboost::filesystem::pathで使用可能な次の分解法を使用することができます。

path root_path() const; 
path root_name() const;   // returns 0 or 1 element path 
path root_directory() const; // returns 0 or 1 element path 
path relative_path() const; 
path parent_path() const; 
path filename() const;   // returns 0 or 1 element path 
path stem() const;    // returns 0 or 1 element path 
path extension() const;   // returns 0 or 1 element path 

たとえばあなたは次のようにルートをストリッピングのバージョンをロールアウトすることができます

#include <iostream> 
#include <boost/filesystem.hpp> 

boost::filesystem::path strip_root(const boost::filesystem::path& p) { 
    const boost::filesystem::path& parent_path = p.parent_path(); 
    if (parent_path.empty() || parent_path.string() == "/") 
     return boost::filesystem::path(); 
    else 
     return strip_root(parent_path)/p.filename(); 
} 

int main() { 
    std::cout << strip_root("/a") << std::endl; 
    std::cout << strip_root("https://stackoverflow.com/a/b") << std::endl; 
    std::cout << strip_root("https://stackoverflow.com/a/b/c") << std::endl; 
    std::cout << strip_root("https://stackoverflow.com/a/b.dir/c.ext") << std::endl;  
} 
// Output: 
"" 
"b" 
"b/c" 
"b.dir/c.ext" 
関連する問題