Как сгенерировать независимый от ОС путь в C++
У меня есть путь назначения и имя файла в виде строки, и я хочу объединить их с C++.
Есть ли способ сделать это и позволить программе / компилятору выбирать между / и \ для Windows или Unix-систем?
5 ответов
Если вы хотите сделать это во время компиляции, вы можете сделать что-то вроде
#ifdef WIN32
#define OS_SEP '\\'
#else
#define OS_SEP '/'
#endif
Или вы можете просто использовать "/", и все будет отлично работать в Windows (за исключением старых программ, которые анализируют строку и работают только с "\"). Это выглядит забавно, только если отображается для пользователя таким образом.
Как это часто бывает, в Boost есть библиотека, которая делает то, что вы хотите. Вот учебник.
Используйте "/" внутри везде. Затем напишите набор служебных функций, которые импортируют путь любой формы в "/". Напишите функцию 'native path', в которой есть специфичные для системы ifdefs и необходимые преобразования. это можно назвать по требованию.
Один простой способ сделать то, что вы просили, - это иметь небольшую (возможно, встроенную) функцию, которая использует магию препроцессора для определения платформы (#ifdef WIN32
и т. д.) и возвращает соответствующий символ-разделитель.
Ответ немного сложнее, потому что есть другие более существенные различия, чем символ разделителя. Файловые системы Windows могут иметь несколько корней (C:\, D:\ и т. Д.), В то время как вся система FS основана на / в Unix-земле.
Лучший совет может быть использовать boost::filesystem
,
/
является переносимым (работает для Windows, начиная с XP)Чтобы быть в безопасности, начиная с С++17:
std::filesystem::path::preferred_separator
, постоянная члена.
См.: https://en.cppreference.com/w/cpp/filesystem/path .
Использоватьstd::filesystem::path
объект. Действия выполняются так, как если бы они имели дело со строками. Объединение возможно черезoperator/=
например,
std::filesystem::path myPath = "abc/def";
myPath /= "hij"; // after a slash
myPath += "klm"; // no slash prepended
std::cout << myPath.c_str() << '\n';
Исход:abc/def/hijklm