2010-07-09 2 views
17

Я пишу кросс-платформенную совместимую функцию в C++, которая создает каталоги на основе входных имен файлов. Мне нужно знать, является ли машина Linux или Windows, и использовать соответствующую косую черту. Для следующего кода ниже, если машина является Linux, то isLinux = true. Как определить ОС?Определите, что Linux или Windows в C++

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); 
+7

Если вы не укажете путь к пользователю, вы можете сохранить его простым и просто использовать косую черту независимо. Windows понимает оба. (Если вы * сделаете * план по его показу, то, вероятно, вы, вероятно, должны использовать обратную косую черту в Windows - это выглядит лучше, чем совместимо с ОС.) –

ответ

32

Использование:

#if defined(WIN32) || defined(_WIN32) || defined(__WIN32) && !defined(__CYGWIN__) 
static const std::string slash="\\"; 
#else 
static const std::string slash="/"; 
#endif 

BTW, вы можете смело использовать эту косую черту "/" на Windows, как окна понимает это прекрасно. Таким образом, просто придерживаться «/» косой черты решения проблем для всех ОС, даже как OpenVMS, где путь foo:[bar.bee]test.ext может быть представлен как /foo/bar/bee/test.ext.

+5

Есть несколько функций Win32, которые не любят неправильный символ разделителя каталогов Win32 «/». Но если вы используете функции Win32, то вы, вероятно, уже знаете, что ориентируетесь на Windows. –

+0

@ Аndreas, функции Win32 имеют проблемы с «/»? – Tomas

+4

«few» Я действительно имею в виду «несколько» ... :) Я думаю, что некоторые из них чувствительны: http://msdn.microsoft.com/en-us/library/bb773559(VS.85).aspx В Кроме того, здесь имеется явное предупреждение: http://msdn.microsoft.com/en-us/library/ms684175(VS.85).aspx. Тем не менее, главное, что я имею против косой черты, это то, что у меня болит в моих глазах, когда я вижу один из них в пути Microsoft Windows ... –

13

В общем, вы бы сделали это с условной компиляцией.

Если вы используете boost::filesystem, вы должны использовать portable generic path format, чтобы вы могли забыть о таких вещах.

+0

Я не уверен, что я понимаю пример « OpenVMS:« SYS1 :: DISK1: [JANE.TYLER.HARRY] "рассматривается как собственный путь с системным именем, именем диска и тремя именами файлов каталогов, а не с портативным именем пути с одним именем файла. - Windows:" c: \\ jane \\ tyler \\ harry "рассматривается как собственный путь с буквой диска, корневым каталогом и тремя именами файлов, а не с переносимым именем пути с одним именем файла. if full_path.native_directory_string() = c: \\ игрушки, и я хочу создать «блоки» папки, то как бы я написал, что с использованием формата переносимого общего пути? – Elpezmuerto

+0

@Elpez: Вы не можете использовать 'native_directory_string' ... Он не будет выводиться в правильном формате. Я могу сказать, что ваш конечный путь к каталогу должен быть чем-то вроде C:/toys/blocks. –

0

Один из наиболее используемых методов для этого - pre-processor directive. Ссылка для C, но они используются одинаково на C++. Справедливое предупреждение, каждый компилятор & ОС может иметь свой собственный набор директив.

1

Посмотрите на http://en.wikipedia.org/wiki/Uname

Если вы используете г ++ в качестве компилятора/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; 
} 
+6

Windows не имеет ничего в каталоге '

+0

@Billy Пожалуйста, прочитайте http://en.wikipedia.org/wiki/Uname перед нисходящим потоком. Я упомянул g ++, и GNU поддерживает это. Я скомпилировал код на g ++/CYGWIN. – Fanatic23

+0

@Billy ONeal - при использовании MinGW или cygwin Windows может обладать им. – doc

4

По умолчанию Visual Studio #define ей _WIN32 в настройках препроцессора проекта.

Таким образом, вы можете использовать

// _WIN32 = we're in windows 
#ifdef _WIN32 
// Windows 
#else 
// Not windows 
#endif 
0

predef.sourceforge.net представляет собой полную коллекцию всех видов макрокоманд, которые идентифицируют компиляторы/операционные системы и многое другое. (привязка непосредственно к подсайту операционной системы)

Смежные вопросы