Как проверить, относится ли путь к тому в Windows в файловой системе C ++ 17? - PullRequest
0 голосов
/ 17 апреля 2020

Я работаю с C ++ 17 на Windows. Насколько я могу видеть, std::filesystem не имеет функции is_root() или чего-то подобного, которая говорит мне, относится ли путь непосредственно к C: или D: или любому другому типу. Я что-то упустил?

В настоящее время я делаю это:

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

Похоже, это работает, но я не знаю, пропускает ли это какие-либо крайние случаи. Есть ли лучший способ?

РЕДАКТИРОВАТЬ:

Я хочу проверить, является ли полный путь просто имя тома (может сопровождаться необязательным sla sh или backsla sh).

Итак, если бы была такая функция, я бы хотел, чтобы она вела себя следующим образом:

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

1 Ответ

1 голос
/ 17 апреля 2020

Сначала проверьте, если это has_root_name(); без него, очевидно, он не определяет объем.

Сложно выяснить, имеет ли only имя root. Это сложно, потому что вы также хотите игнорировать root -каталог пути, если он указывает его.

Диапазон итераторов - это хорошее, дружественное к производительности решение. Если он имеет root -имя, то begin() указывает на это root -имя. Поэтому, если вы увеличиваете его, он указывает на следующий компонент в пути.

Если путь имеет и root -имя, и root -каталог, то компонент после root - имя является root -каталогом. Таким образом, если вы увеличиваете значение на , итератор либо указывает на дополнительный компонент, либо достигает 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;
}
...