Я работаю над кодом, который включает в себя загрузку файла из пути, который составлен как объединение заданного «базового» пути и вторичного относительного пути, загруженного из другого файла.Например (и там, где я сталкиваюсь с проблемой), базовый путь - «assets / models /», а вторичный путь - «maps \ map.png».Прямое объединение этих двух строк дает "assets / models / maps \ map.png".При работе в системах POSIX это не удается загрузить.До сих пор я разбирался с этим, просто заменяя обратные слэши на прямые косые черты на
std::replace( path.begin(), path.end(), '\\', '/' );
, но я хотел бы использовать C ++ 17 для std::filesystem::path
это вместо этого.
Описание std::filesystem::path::make_preferred()
предполагает, что он должен заменить разделители:
"Преобразовывает все разделители каталога в представлении общего формата пути к предпочтительному каталогуразделитель. Например, в Windows, где \ является предпочтительным разделителем, путь foo / bar будет преобразован в foo \ bar "
Однако при реализации в коде он не преобразуетсячто-нибудь.Я также проверил, что std :: filesystem :: path :: предпочитаемый_сепаратор соответствует ожидаемому - '/'.
Не понимаю ли я цель make_preferred()
?Или я просто неправильно его использую?
Вот урезанная версия кода, которая не работает (это не реализованный код, но достаточно близко к нему):
const char * loadedPath = "maps\\map.png"
std::string loadedPathStr = std::string( loadedPath );
auto wPath = std::filesystem::path( loadedPathStr );
wPath = wPath.make_preferred();
basePath = std::filesystem::path( "./a/b/" );
auto totalPath = basePath / wPath;
auto wStr = totalPath.generic_string();
std::cout << wStr << std::endl;
Это выводит "./a/b/maps\\map.png"
При отладке внедренного кода, похоже, что wPath
оптимизировано;нет никакого способа проверить это.
Странно, когда я компилирую и запускаю эту автономную тестовую программу, она работает как положено:
int main(){
assert( std::filesystem::path::preferred_separator == '/' );
const char * cPath = "maps\\map.png";
std::string path = std::string( cPath );
auto wPath = std::filesystem::path( path );
wPath = wPath.make_preferred();
std::string wStr = wPath.generic_string();
std::cout << wStr << std::endl;
}
Это выводит "maps / map.png". Я не умею читать.Это также выводит неверное значение.
Кто-нибудь знает, что здесь происходит?
РЕДАКТИРОВАТЬ: Попытка компиляции с помощью clang (с использованием gcc раньше), и она работает как положено (разделитель конвертируется). Проигнорируйте это, допустили ошибку при перекомпиляции.
Я запускаю это в Linux, и путь существует.