我正在尝试比较两个目录,并找出哪些文件不同内部。所以我使用boost::filesystem::recursive_directory_iterator
将每个目录的所有内容添加到相应的向量中。然后我按字母顺序对每个矢量进行排序并开始比较路径问题是它包括“基础”路径,我不希望这样,例如:
版本1 /资产/ info.txt
版本2 /资产/ info.txt
这些路径比较不同,但我希望它们进行比较。为了澄清,我甚至没有检查二进制文件,只是到目前为止的路径名称。我要像这样比较它们:
/Assets/info.txt
我一直在浏览提升文档几个小时,我确信必须有一个优雅的解决方案来解决我的问题。我意识到我可以通过获得我想要的子串来解决这个问题,但必须有一个不那么难看的方式。
答案 0 :(得分:6)
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"
答案 1 :(得分:1)
我想我有更干净的解决方案:
fs::path stripFirstDir(fs::path p)
{
p = p.relative_path();
if (p.empty()) return {};
return p.lexically_relative(*p.begin());
}