簡體   English   中英

C++:在比較 boost::filesystem 中的路徑時如何忽略第一個目錄路徑?

[英]C++: How do I ignore the first directory path when comparing paths in boost::filesystem?

我想比較兩個目錄和查找文件是不同的內部 所以我使用boost::filesystem::recursive_directory_iterator將每個目錄的所有內容添加到相應的向量中。 然后我按字母順序對每個向量進行排序並開始比較路徑。 問題是它包括“基本”路徑,我不想要這樣,例如:

Version1/Assets/info.txt

Version2/Assets/info.txt

這些路徑比較不同,但我希望它們比較相同。 澄清一下,我什至還沒有檢查二進制文件,到目前為止只檢查路徑名。 我會像這樣比較它們:

/資產/信息.txt

我已經瀏覽了幾個小時的 boost 文檔,我相信我的問題一定有一個優雅的解決方案。 我意識到我可以通過獲取我想要的子字符串來解決這個問題,但必須有一種不那么難看的方法。

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("/a/b") << std::endl;
    std::cout << strip_root("/a/b/c") << std::endl;
    std::cout << strip_root("/a/b.dir/c.ext") << std::endl;    
}
// Output:
""
"b"
"b/c"
"b.dir/c.ext"

我想我有更清潔的解決方案:

fs::path stripFirstDir(fs::path p)
{
    p = p.relative_path();
    if (p.empty()) return {};
    return p.lexically_relative(*p.begin());
}

https://godbolt.org/z/hr3hcr

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM