【问题标题】:C++: How do I ignore the first directory path when comparing paths in boost::filesystem?C++:在比较 boost::filesystem 中的路径时,如何忽略第一个目录路径?
【发布时间】:2014-01-31 03:47:28
【问题描述】:

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

Version1/Assets/info.txt

Version2/Assets/info.txt

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

/Assets/info.txt

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

【问题讨论】:

  • substring 方法可能是你最好的选择。这是我在比较两个目录树时所做的。

标签: c++ boost filesystems boost-filesystem


【解决方案1】:

我认为我有更清洁的解决方案:

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

【讨论】:

    【解决方案2】:

    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"
    

    【讨论】:

      猜你喜欢
      • 2012-01-20
      • 2011-01-17
      • 2011-04-25
      • 2017-08-16
      • 1970-01-01
      • 2012-04-27
      • 2011-02-15
      • 1970-01-01
      相关资源
      最近更新 更多