如何检查路径是否引用了具有 C++17 文件系统的 Windows 中的卷?



我在Windows上使用C++17。据我所见,如果路径直接指向C:或D:或任何其他卷,std::filesystem没有is_root()函数或类似的东西告诉我。我是不是错过了什么?

目前我正在做这个:

if (path.parent_path() == path)
{
//
}

它看起来很有效,但我不知道这是否遗漏了任何边缘案例。有更好的方法吗?

编辑:

我想检查整个路径是否是,只是卷名(后面可能跟着一个可选的斜杠或反斜杠(。

所以,如果有这样的函数,我希望它的行为如下:

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()指向该根名称。因此,如果将其递增,它将指向路径中的下一个组件。

如果路径同时具有根名称和根目录,那么根名称之后的组件就是根目录。因此,如果您的增量超过,则迭代器要么指向一个附加组件,要么已达到范围的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;
}

相关内容

最新更新