C++:在比较 boost::文件系统中的路径时,如何忽略第一个目录路径
C++: How do I ignore the first directory path when comparing paths in boost::filesystem?
我正在尝试比较两个目录并找出内部不同的文件。 所以我使用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
相关文章:
- 在fstream期间忽略空行
- 如何将更多文件夹添加到c++include路径
- 带有特殊路径部分的"std::filesystem::weakly_canonical"失败
- 函数何时会在c++中包含stack_Unwind_Resume调用
- 概念TS检查忽略私有访问修饰符
- C++A*算法并不总是在路径中具有目标节点
- C++宏忽略之后的内容
- Python中的for循环与C++有何不同
- 不知道某个东西是否被忽略会引入未定义的行为吗
- clang整洁10忽略了我的NOLINT命令
- 从函数角度看ID到文件路径的内部与外部映射
- If语句在c++中被忽略
- boost xml parsingl将xml的路径作为变量发送
- 错误:在为指针赋值时,void值没有被忽略
- 为什么stream::忽略未按预期工作
- Craps游戏问题,忽略if语句
- 对于MacOS上的G++,如何添加默认的include目录/usr/local/include和默认的库搜索路径/usr
- JNA 库路径似乎被忽略了
- C++:在比较 boost::文件系统中的路径时,如何忽略第一个目录路径
- clang::HeaderSearch搜索路径被忽略