2014-01-12 48 views
5

我試圖比較兩個目錄,並找到裏面的文件。所以我使用boost::filesystem::recursive_directory_iterator將每個目錄的所有內容添加到各自的向量中。然後我按字母順序排列每個矢量,並開始比較路徑。問題是它包括「基地」路徑,我不希望出現這種情況,例如:C++:在比較boost :: filesystem中的路徑時如何忽略第一個目錄路徑?

版本1 /資產/ info.txt

版本2 /資產/ info.txt

這些路徑比較不同,但我希望他們比較相同。爲了澄清,我甚至沒有檢查二進制文件,只是路徑名到目前爲止。我倒是對他們這樣的比較:

/Assets/info.txt

我已經翻閱了幾個小時的升壓文檔和我相信一定有我的問題一個完美的解決方案。我意識到我可以通過獲得我想要的子串來解決這個問題,但是必須有一個不太難看的方法。

+0

的子方法可能是你最好的選擇。這是我比較兩個目錄樹時所做的。 –

回答

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"