Лексическое сравнение std :: filesystem :: path без учета регистра? - PullRequest
0 голосов
/ 21 апреля 2020

Моя проблема примерно такая: чтобы определить, идентичны ли два пути на платформе windows, пути сравниваются без учета регистра, например. «C: \ test.txt» и «C: \ Test.txt» преобразуются в один и тот же элемент файла. Я мог бы легко решить эту проблему, используя, например, std::filesystem::equal, но для этой конкретной проблемы я бы хотел немного сэкономить на обходе ОС (работа на холостом ходу и выполнение 100+ сравнений на каждом l oop - я боюсь, что это произойдет быть заметным)

using path = std::filesystem::path;
const bool result =  (path("C:\\test.txt").lexically_normal().make_preferred().native() == path("C:\\Test.txt").lexically_normal().make_preferred().native());

При сравнении std::filesystem::path даже при лексической нормализации путем вызова lexical_normal выполняется общий c способ и, таким образом, рассматривается случай. Это, конечно, имеет смысл, но кроме сравнения строк сам я не вижу способа сделать это с библиотекой без сравнения: можно ли каким-то образом переопределить сравнение путей?

Я также изучил boost::filesystem, но, насколько я могу судить, проблема тоже не решается.

1 Ответ

0 голосов
/ 21 апреля 2020

Смысл различия path/filesystem состоит в том, чтобы различать тип path как универсальный c механизм хранения путей, которыми можно манипулировать и использовать с любой файловой системой, и filesystem -specifi. c операции, которые могут отличаться в зависимости от конкретной реализации. То, что две неравные path объекты могут считаться filesystem::equivalent одной файловой системой, а не другой, является лишь частью сделки.

Не существует механизма для выполнения работы с поддержкой файловой системы path " нормализация ", которая не является операцией файловой системы.

...