gpt4 book ai didi

C++:比较 boost::filesystem 中的路径时如何忽略第一个目录路径?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:24:52 25 4
gpt4 key购买 nike

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

Version1/Assets/info.txt

Version2/Assets/info.txt

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

/ Assets /信息.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"

关于C++:比较 boost::filesystem 中的路径时如何忽略第一个目录路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21073655/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com