Я пишу межплатформенную совместимую функцию в C++, который создает каталоги на основе входных имен файлов. Я должен знать, является ли машиной Linux или окна, и используйте соответствующее вперед или наклонную черту влево. Для следующего кода ниже, если машиной является Linux затем isLinux = true
. Как я определяю ОС?
bool isLinux;
std::string slash;
std::string directoryName;
if isLinux
slash = "/";
else
slash = "\\";
end
boost::filesystem::create_directory (full_path.native_directory_string() + slash + directoryName);
Use:
#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__)
static const std::string slash="\\";
#else
static const std::string slash="/";
#endif
BTW, вы все еще можете безопасно использовать этот слэш "/" в Windows, так как windows прекрасно это понимает. Поэтому простое использование слэша "/" решит проблемы для всех ОС, даже таких как OpenVMS, где путь foo:[bar.bee]test.ext
может быть представлен как /foo/bar/bee/test.ext
.
Вообще говоря, вы должны сделать это с помощью условной компиляции.
Тем не менее, если вы используете boost::filesystem
, вам следует использовать portable generic path format, чтобы вы могли забыть о подобных вещах.
Загляните в http://en.wikipedia.org/wiki/Uname
Если вы используете g ++ в качестве компилятора / GNU, вы можете попробовать приведенный ниже код. POSIX-совместимые среды поддерживают это:
#include <stdio.h>
#include <sys/utsname.h>
#include <stdlib.h>
int main()
{
struct utsname sysinfo;
if(uname(&sysinfo)) exit(9);
printf("os name: %s\n", sysinfo.sysname);
return 0;
}
Одним из наиболее часто используемых методов для этого является директива препроцессора. Ссылка дана для языка C, но в C++ они используются точно так же. Предупреждение: каждый компилятор и ОС могут иметь свой собственный набор директив.