Используя файловую систему :: путь, как вы открываете файл кросс-платформенным способом?

Допустим, вы использовали новый код std::filesystem (или std::experimental::filesystem) для поиска файла. У вас есть переменная path, содержащая полный путь к этой переменной.

Как открыть этот файл?

Это может звучать глупо, но примите во внимание очевидный ответ:

std::filesystem::path my_path = ...;
std::ifstream stream(my_path.c_str(), std::ios::binary);

Это не гарантировано для работы. Почему? Потому что в Windows, например, path::string_type равно std::wstring. Итак, path::c_str вернет const wchar_t*. И std::ifstream может только принимать пути с типом const char*.

Теперь оказывается, что этот код действительно будет работать в VS. Почему? Поскольку в Visual Studio есть расширение библиотеки , которое позволяет этому работать. Но это нестандартное поведение и, следовательно, не переносимо. Например, я понятия не имею, предоставляет ли GCC для Windows такую ​​же функцию.

Вы можете попробовать это:

std::filesystem::path my_path = ...;
std::ifstream stream(my_path.string().c_str(), std::ios::binary);

Только винда нас опять смущает. Потому что, если my_path содержит символы Unicode, то теперь вы зависите от правильной настройки локали Windows ANSI. И даже это не обязательно спасет вас, если путь содержит символы из нескольких языков, которые не могут существовать в одной и той же локали ANSI.

У Boost Filesystem действительно была похожая проблема. Но они расширили свою версию iostreams, чтобы напрямую поддерживать paths.

Я что-то упустил здесь? Добавил ли комитет кроссплатформенную библиотеку файловой системы, не добавляя в нее кроссплатформенный способ открывать файлы?


person Nicol Bolas    schedule 30.06.2016    source источник


Ответы (1)


Бо Перссон указал, что это является предметом стандартный отчет о дефектах библиотеки. Этот дефект был устранен, и C++17 будет поставляться, требуя реализации, в которой path::value_type не является char, чтобы их типы файловых потоков принимали const filesystem path::value_type*s в дополнение к обычным версиям const char*.

person Community    schedule 30.06.2016
comment
Это не так. Хотя это, вероятно, будет исправлено до публикации C++17. - person T.C.; 30.06.2016
comment
Открыто: 09 марта 2017 г. (open- std.org/jtc1/sc22/wg21/docs/lwg-active.html#2943) - person Cheers and hth. - Alf; 30.04.2017