C++:在比较 boost::文件系统中的路径时,如何忽略第一个目录路径

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

本文关键字:路径 何忽略 第一个 比较 boost 文件系统 C++      更新时间:2023-10-16

我正在尝试比较两个目录并找出内部不同的文件。 所以我使用boost::filesystem::recursive_directory_iterator将每个目录的所有内容添加到各自的向量中。 然后我按字母顺序对每个向量进行排序并开始比较路径。 问题是它包含"基本"路径,我不想要它,例如:

版本1/资产/信息.txt

版本 2/资产/信息.txt

这些路径比较不同,但我希望它们比较相同。 澄清一下,到目前为止,我什至还没有检查二进制文件,只是检查路径名。 我会像这样比较它们:

/

资产/信息.txt

我已经浏览了几个小时的提升文档,我相信一定有一个优雅的解决方案来解决我的问题。 我意识到我本可以通过获得我想要的子字符串来解决这个问题,但必须有一个不那么丑陋的方法。

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