如何在Windows中使用C ++ 17的文件系统检查路径是否指向卷?

问题描述 投票:0回答:1

我正在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
c++ windows filesystems c++17
1个回答
0
投票
首先,检查是否为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; }
© www.soinside.com 2019 - 2024. All rights reserved.