我正在Windows上使用C ++ 17。据我所知,std::filesystem
没有is_root()
函数或类似的东西告诉我路径是否直接指向C:或D:或任何其他volumen。我想念什么吗?
当前我正在这样做:
if (path.parent_path() == path)
{
//
}
似乎正在运行,但我不知道这是否会遗漏任何边缘情况。有没有更好的方法?
我想检查路径的整体是否为卷名just(可能后跟可选的斜杠或反斜杠)。
所以,如果有这样的函数,我希望它表现如下:
namespace fs = std::filesystem;
is_root(fs::path{ "C:" }); // true
is_root(fs::path{ "D:\\"}); // true
is_root(fs::path{ "C:/users" }) // false
is_root(fs::current_path()) // usually false, unless the executable was started directly in C: or D: or any other drive
has_root_name()
;没有一个,它显然没有指定音量。最难的部分是弄清它是否[
迭代器范围是一种很好的,性能友好的解决方案。如果它具有根名称,则begin()
指向该根名称。因此,如果增加它,它将指向路径中的下一个组件。
that
,则迭代器要么指向其他组件,要么已达到范围的end
。如果它位于end
,则什么也没剩下,您知道该路径是“只是一个体积”。代码看起来像这样:
bool is_volume(const fs::path &p)
{
if(!p.has_root_name()) return false;
auto it = p.begin();
++it; //Skip the root-name
if(p.has_root_directory())
++it; //Skip the root-directory.
if(it == p.end())
return true;
return false;
}