powered by simpleCommunicator - 2.0.29     © 2024 Programmizd 02
Map
Форумы / C++ [игнор отключен] [закрыт для гостей] / MSVC + std::filesystem: разделители пути в стиле Linux
22 сообщений из 22, страница 1 из 1
MSVC + std::filesystem: разделители пути в стиле Linux
    #40041846
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть путь на диске, разделитель в нём неизвестен. Даже может быть и прямой и
обратный слеш в одном пути. Нужно сделать путь абсолютным, но слеш что бы
был — прямой слеш. Под Windows.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
namespace fs = std::filesystem;
try
{
    fs::path p = fs::path("..") / "../.." / "AppData";
    auto aaa = fs::weakly_canonical(p);
    auto bbb = fs::absolute(p);
    p.clear();
}
catch (std::filesystem::filesystem_error const &err)
{
}


Но не выходит. Пути `aaa` и `bbb` хорошие выходят. Но слеши не правильные — обратные!

И как же это сделать? :)
...
Рейтинг: 0 / 0
MSVC + std::filesystem: разделители пути в стиле Linux
    #40041867
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А распечатай на экране aaa, bbb.
...
Рейтинг: 0 / 0
MSVC + std::filesystem: разделители пути в стиле Linux
    #40041919
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
petrav
И как же это сделать? :)

Средствами std::filesystem никак. Для Windows можно все слеши привести к одному, который предпочтителен для Windows, т.е. к обратному слэшу. В методе make_preferred() замена L'/' на L'\\' вообще захардкодена.

Просто замени руками:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
using namespace std;
namespace fs = std::filesystem;

        fs::path p = fs::path("..") / "../.." / "XYZ";
        wstring sss = fs::absolute(p);

        wcout << sss << endl;
        replace(sss.begin(), sss.end(), L'\\', L'/');
        wcout << sss << endl;
...
Рейтинг: 0 / 0
MSVC + std::filesystem: разделители пути в стиле Linux
    #40042023
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ъъъъъ
petrav
И как же это сделать? :)

Средствами std::filesystem никак. Для Windows можно все слеши привести к одному, который предпочтителен для Windows, т.е. к обратному слэшу. В методе make_preferred() замена L'/' на L'\\' вообще захардкодена.

Спасибо.
...
Рейтинг: 0 / 0
MSVC + std::filesystem: разделители пути в стиле Linux
    #40042118
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ъъъъъДля Windows можно все слеши привести к одному, который предпочтителен для Windows, т.е. к
обратному слэшу.

Вообще-то Windows уже довольно давно всё равно, она работает с обеими слэшами без проблем.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
MSVC + std::filesystem: разделители пути в стиле Linux
    #40042119
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

ъъъъъДля Windows можно все слеши привести к одному, который предпочтителен для Windows, т.е. к
обратному слэшу.

Вообще-то Windows уже довольно давно всё равно, она работает с обеими слэшами без проблем.
+1 AFAIK
...
Рейтинг: 0 / 0
MSVC + std::filesystem: разделители пути в стиле Linux
    #40042133
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

ъъъъъДля Windows можно все слеши привести к одному, который предпочтителен для Windows, т.е. к
обратному слэшу.

Вообще-то Windows уже довольно давно всё равно, она работает с обеими слэшами без проблем.

Насколько я помню по чтению документации осталось несколько функций из WinAPI, которые не воспринимают прямые слеши. Плюс я наблюдаю, что WSH не всегда понимает прямой слеш.

Но дело не в этом, дело в негибкости std::filesystem. Так что пришлось применить std::replace.
...
Рейтинг: 0 / 0
MSVC + std::filesystem: разделители пути в стиле Linux
    #40042137
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petravПлюс я наблюдаю, что WSH не всегда понимает прямой слеш.

Так мы же в Си разделе, что нам до какого-то скрипта?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
MSVC + std::filesystem: разделители пути в стиле Linux
    #40042177
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

petravПлюс я наблюдаю, что WSH не всегда понимает прямой слеш.

Так мы же в Си разделе, что нам до какого-то скрипта?..

К слову пришлось. Это же встроенный в Винду компонент, хоть и устаревший. Это часть Винды. Да и вызывает же он WinAPI.
...
Рейтинг: 0 / 0
MSVC + std::filesystem: разделители пути в стиле Linux
    #40042191
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Между "понимает" в предыдущем сообщении и "вызывает" в этом - толстая-толстая прослойка
дикого кода.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
MSVC + std::filesystem: разделители пути в стиле Linux
    #40042221
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov
ъъъъъДля Windows можно все слеши привести к одному, который предпочтителен для Windows, т.е. к
обратному слэшу.

Вообще-то Windows уже довольно давно всё равно, она работает с обеими слэшами без проблем.
Я лишь сказал о логике, реализованной в std:: filesystem.
...
Рейтинг: 0 / 0
MSVC + std::filesystem: разделители пути в стиле Linux
    #40042348
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот тут достаточно хорошо описаны различия

https://en.wikipedia.org/wiki/Path_(computing)
...
Рейтинг: 0 / 0
MSVC + std::filesystem: разделители пути в стиле Linux
    #40042383
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton,

при чем тут вики и реализация Windows. ТС хочет средствами std::filesystem управлять значением разделителя директорий в строке пути. Сие - невозможно, ибо классе path член preferres_separator является константным , и определен как бэкслэш для Windows, и как форвардслэш для POSIX. Сие описано "в стандарте". В конкретной реализации (MS VS - 2019) - ещё суровее, например, в make_preferred() не используется даже не preferres_separator, а бессовестно
Код: plaintext
1.
            _STD replace(_Text.begin(), _Text.end(), L'/', L'\\');
...
Рейтинг: 0 / 0
MSVC + std::filesystem: разделители пути в стиле Linux
    #40042396
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ъъъъъ
mayton,

при чем тут вики и реализация Windows. ТС хочет средствами std::filesystem управлять значением разделителя директорий в строке пути. Сие - невозможно, ибо классе path член preferres_separator является константным , и определен как бэкслэш для Windows, и как форвардслэш для POSIX. Сие описано "в стандарте". В конкретной реализации (MS VS - 2019) - ещё суровее, например, в make_preferred() не используется даже не preferres_separator, а бессовестно
Код: plaintext
1.
            _STD replace(_Text.begin(), _Text.end(), L'/', L'\\');


Я, конечно, видел что preferred_separator константный. Просто перед написанием очередного
костыля решил уточнить: а вдруг я что-то не дочитал. :)
...
Рейтинг: 0 / 0
MSVC + std::filesystem: разделители пути в стиле Linux
    #40042402
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ъъъъъ
mayton,

при чем тут вики и реализация Windows. ТС хочет средствами std::filesystem управлять значением разделителя директорий в строке пути. Сие - невозможно, ибо классе path член preferres_separator является константным , и определен как бэкслэш для Windows, и как форвардслэш для POSIX. Сие описано "в стандарте". В конкретной реализации (MS VS - 2019) - ещё суровее, например, в make_preferred() не используется даже не preferres_separator, а бессовестно
Код: plaintext
1.
            _STD replace(_Text.begin(), _Text.end(), L'/', L'\\');


Потому-что тема топика - Windows. А там - самые хитрые правила работы с Path.
...
Рейтинг: 0 / 0
MSVC + std::filesystem: разделители пути в стиле Linux
    #40042406
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ъъъъъклассе path член preferres_separator является *константным*

Но у его конструкторов есть второй параметр. О котором аффтар и не дочитал.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
MSVC + std::filesystem: разделители пути в стиле Linux
    #40042408
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

ъъъъъклассе path член preferres_separator является *константным*

Но у его конструкторов есть второй параметр. О котором аффтар и не дочитал.

Читал, оно не помогает.
...
Рейтинг: 0 / 0
MSVC + std::filesystem: разделители пути в стиле Linux
    #40042425
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
petrav
Dimitry Sibiryakov

пропущено...

Но у его конструкторов есть второй параметр. О котором аффтар и не дочитал.

Читал, оно не помогает.

По справедливости говоря, вы не дали ошибку.
Вы только сказали что "не в ту сторону" для вас визуально.
Вот например, в Qt слеши визуально это внутреннее представление пути. Хоть вертикальные черточки с:|темп.
Кроссплатформенность обязывает.
...
Рейтинг: 0 / 0
MSVC + std::filesystem: разделители пути в стиле Linux
    #40042483
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Метод std::filesystem::path::generic_string() возвращает строку с разделителями в стиле Линукс.

Код: plaintext
1.
path = path.generic_string() + '/';


Странно что не работает второй аргумент конструктора std::filesystem::path.
...
Рейтинг: 0 / 0
MSVC + std::filesystem: разделители пути в стиле Linux
    #40042485
petrav
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всё с обратными слешами не смотря на fs::path::format::generic_format.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
    namespace fs = std::filesystem;
    try
    {
        fs::path p = fs::path("..", fs::path::format::generic_format) / "../.." / "AppData";
        auto aaa = fs::weakly_canonical(p);
        auto bbb = fs::absolute(p);
        p.clear();
    }
    catch (std::filesystem::filesystem_error const &err)
    {
    }
...
Рейтинг: 0 / 0
MSVC + std::filesystem: разделители пути в стиле Linux
    #40042616
Фотография Alex_Ustinov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
generic_format (since C++17)?
...
Рейтинг: 0 / 0
MSVC + std::filesystem: разделители пути в стиле Linux
    #40096774
ъъъъъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот интересно.

В MSVS-2019, если для C++ проекта определить С++ Language Standard как ISO C++17 Standard (/std:c++17), нэймспейс filesystem доступен как std::filesystem.
А если определить ISO C++20 Standard (/std:c++20), то нэймспейс filesystem доступен как std::experimental::filesystem. Как в предыдущем (перед С++17) стандарте.

Что за фигня.
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / MSVC + std::filesystem: разделители пути в стиле Linux
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]