У меня такое чувство, что стандарт файловой системы C ++ нарушен в Windows.Он в значительной степени основан на Boost.filesystem, и я только что обнаружил там серьезную проблему, которая (вероятно) также существует в std :: filesystem: https://github.com/boostorg/filesystem/issues/99
Суть - определение «root_name» и «root_directory»:
root-name (необязательно): определяет корень в файловой системе с несколькими корнями (например, «C:» или «// myserver»).В случае неоднозначности самая длинная последовательность символов, которая образует правильное корневое имя, обрабатывается как корневое имя.Стандартная библиотека может определять дополнительные корневые имена, помимо тех, которые понятны для API OS.
root-directory (необязательно): разделитель каталогов, который, если присутствует, помечает этот путь как абсолютный.Если он отсутствует (и первым элементом, отличным от корневого имени, является имя файла), то этот путь является относительным и требует другого пути в качестве исходного местоположения для разрешения имени файла.
Для этого необходимо, например, разложить "C: \ foo \ bar.txt" на:
- root_name: "C:"
- root_directory:"\" или "/" (это вообще имеет смысл?)
- каталог: "foo"
- имя_файла "bar.txt"
Проблема сейчас: Первая часть этого пути не является путем, по крайней мере, не оригинальным.Это вытекает из интерпретации в Windows:
- «C: \» - это диск «C»
- «C:» - это текущий рабочий каталог на диске «C»
Minor: Как интерпретировать файл "\ foo \ bar.txt" в Windows в соответствии с приведенным выше описанием?У вас есть «root_directory» (который, как ни странно, не каталог, а каталог разделитель ), но нет «root_name», следовательно, путь не может быть абсолютным, поэтому у вас нет и «root_directory».вздох.
Итак, я чувствую, что «root_name» и «root_directory» не могут быть разложены (в Windows).В «C: \ foo» у вас будет «C: \», а в «C: foo» - «C:».Или чтобы сохранить (странно определенный) «корневой_каталог», вам нужно установить декомпозицию «C: \ foo» на «C: \», «\» и «foo» и бороться с последним: это абсолютный путь?На самом деле это так: «Папка« foo »в текущем рабочем каталоге на диске C», абсолютно абсолютная, не правда ли?
Но хорошо, что вы могли бы сказать «absolute == независимо от текущего рабочего каталога»«root_directory» имеет смысл: он будет «\» для «C: \ foo» и пуст для «C: foo».
Так что вопрос: является ли стандарт неправильным в определении «C:» как«root_name» вместо «C: \» в путях типа «C: \ foo» или это просто недопустимое использование для перебора компонентов пути, ожидающих, что суммы префикса будут «действительными»?