Является ли std :: filesystem :: directory_entry каноническим? - PullRequest
1 голос
/ 18 июня 2020

Я использую Windows (файловая система без учета регистра, но с сохранением регистра), и мне приходится иметь дело с различными путями ввода (предоставленными пользователем и созданными машиной), которые могут быть или не быть каноническими (нормализованные, абсолютные, в правильном случае ...). Я собираюсь использовать fs :: path в качестве ключей в картах и ​​наборах. По соображениям производительности я хочу иметь возможность полагаться на чистое сравнение / хэши строк. Поэтому я должен канонизировать все входные пути.

Проблема в том, что я рекурсивно повторяю один из входных путей. Когда я начинаю эту итерацию с неканонического пути root, результирующие элементы directory_entries также не являются каноническими. Но когда я начинаю итерацию с канонического пути root, полученные в результате directory_entries также кажутся каноническими. Итак, часть root, похоже, зависит от начального пути root. Теперь мне было интересно, есть ли гарантия, что повторяемая часть является канонической или нет? Если нет, мне нужно канонизировать каждую запись_каталога, но я бы хотел избежать лишнего доступа к файловой системе.

Я ничего не нашел на cppreference.com, и быстрое прочтение стандартного документа о библиотеке файловой системы дало тоже ничего.

#include <filesystem>
namespace fs = std::filesystem;

void scan_folder(fs::path const & root_path) {
    for (auto & entry : fs::recursive_directory_iterator{root_path}) {
        // entry.path() == root_part / iterative_part
        // root_part == root_path, depends on root_path being canonical
        // but what about iterative_part?
        _ASSERTE(entry.path() == fs::canonical(entry.path()));
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...