Как сгенерировать независимый от ОС путь в 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,

  1. /является переносимым (работает для Windows, начиная с XP)

  2. Чтобы быть в безопасности, начиная с С++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

Другие вопросы по тегам