Здравствуйте, ·, Вы писали:
·>Тут вроде только ты обманываешься.
В чём?
BFE>> Это подход unix подобных реализаций, в которых полагают, что всякая сущность системы есть файл.
·>Допустим, что это подход unix. Хорошо, но уже лучше. Так причём тут std::filesystem?
Судя по отсылкам в документации к POSIX ( например
тут) разработка std::filesystem базировалась на этом взятом из UNIX систем стандарте. Очевидно же.
BFE>>Взяв за основу эту "аксиому" пытаются написать реализацию, получается, понятно, весьма криво. Эту кривизну видно даже в интерфейсе утилит.
·>Полагаю, что основа твоего непонимания в том, что только для некоего пути "/a/b/c" — невозможно сказать, является ли "c" файлом или дирой. Для этого надо залезть на диск и прочитать. Даже банальное "ls /a/b/c" — неясно. Толи выведет инфу о файле или содержимое диры.
Верно, что для записи "/a/b/c" — невозможно сказать, является ли "c" файлом или директорией. А вот для записи "/a/b/c/" — можно. Было бы логично определить, что все пути заканчивающиеся разделителем не являются файлами, а все не заканчивающиеся разделителями — содержат в конце имя файла. Тогда:
"a" — имя файла
"a/" — имя каталога
"/a" — имя файла
"/a/" — имя каталога
"./" — имя каталога
"." — имя файла
".." — имя файла
"../" — имя каталога
Впрочем для "." и ".." можно сделать исключение, правда, непонятно, зачем. Хотя... Не бывает систем, где "." и ".." может являться именем файла?
В общем лично у меня много вопросов к тому, почему std::filesystem выглядит так, а не иначе.
·>А ещё бывают другие типы файлов — ссылки, сокеты, пайпы, етс.
Во-во. "Смешались к кучу кони, люди...". Зачем это протащили в стандарт? Почему эти типы файлов не implementation defined?
Или, вот ссылки, к примеру. В документации сказано, что ссылку на директорию и ссылку на файл надо создавать разными функциями
здесь. Однако, если ссылка уже создана, то узнать, является ли она ссылкой на файл или директорию невозможно, если таргет был удалён. В std::filesystem::file_type просто отсутствует соответствующий тип!
BFE>>Возвращаемое значение должно быть вида {путь, имя}, где имя — это последнее имя в pathName, а путь — это то, что перед ним. Имя должно быть пустым, если его нельзя вычленить.
·>У path как правило есть методы "взять имя" и "взять родительский путь". По сути — части после последнего "/" и до.

Значит написать такую функцию просто? Напишите?
BFE>>Из-за того, что std::filesystem::path может быть и файлом и путём,
·>Нет. path может быть только путём. Посмотри в словаре значение слова "path".
Посмотрел:
A path (or filepath, file path, pathname, or similar) is a text string that uniquely specifies an item in a hierarchical file system. Generally, a path is composed of directory names, special directory specifiers and optionally a filename, separated by delimiting text.
Там ещё есть интересная таблица. Хочется пожелать удачи авторам std::filesystem в имплантации их библиотеки на всех перечисленных системах...
BFE>> функция теряет свой тривиальный вид. Собственно, размер кода этой функции удваивается из-за выбранного подхода в std::filesystem.
·>
Действительно, ведь для ключей "
-t и
-T" дополнительный код писать не надо.