2010-07-09 26 views
17

Estoy escribiendo una función compatible multiplataforma en C++ que crea directorios basados ​​en nombres de archivos de entrada. Necesito saber si la máquina es Linux o Windows y usar la barra inclinada hacia delante o hacia atrás. Para el siguiente código a continuación, si la máquina es Linux, entonces isLinux = true. ¿Cómo determino el sistema operativo?Determine si Linux o Windows en 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

Si no va a mostrar la ruta al usuario, puede mantenerlo simple y usar una barra inclinada independientemente. Windows entiende ambos. (Sin embargo, si * planea * mostrarlo, probablemente debería usar barras diagonales inversas en Windows, parece mejor ser coherente con el sistema operativo). –

Respuesta

32

Uso:

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

Por cierto, todavía se puede utilizar con seguridad esta barra "/" en Windows como ventanas entiende esto perfectamente. Así que simplemente seguir con "/" slash resolvería problemas para todos los sistemas operativos, incluso como OpenVMS donde la ruta es foo:[bar.bee]test.ext se puede representar como /foo/bar/bee/test.ext.

+5

Hay algunas funciones de Win32 que no les gusta el carácter separador de directorio Win32 incorrecto "/". Pero si usa las funciones de Win32, probablemente ya sepa que está apuntando a Windows. –

+0

@Andreas, ¿qué funciones de Win32 tienen problemas con el "/"? – Tomas

+4

Por "pocos" realmente quiero decir "pocos" ... :) Creo que algunos de estos son sensibles: http://msdn.microsoft.com/en-us/library/bb773559(VS.85).aspx In Además, hay una advertencia explícita aquí: http://msdn.microsoft.com/en-us/library/ms684175(VS.85).aspx. Sin embargo, lo principal que tengo en contra de la barra diagonal es que me duele cuando veo uno de esos en una ruta de Microsoft Windows ... –

13

En general, tendrías que hacer esto con la compilación condicional.

Dicho esto, si está utilizando boost::filesystem debe utilizar el portable generic path format para que pueda olvidarse de cosas como esta.

+0

No estoy seguro de entender el ejemplo " OpenVMS:" SYS1 :: DISK1: [JANE.TYLER.HARRY] "se trata como un nombre de ruta nativo con un nombre de sistema, nombre de unidad y tres nombres de archivo de directorio, en lugar de un nombre de ruta portátil con un nombre de archivo. - Windows:" c: \\ jane \\ tyler \\ harry "se trata como una ruta de acceso nativa con una letra de unidad, directorio raíz y tres nombres de archivo, en lugar de una ruta de acceso portátil con un nombre de archivo. if full_path.native_directory_string() = c: \\ juguetes y quiero crear carpetas "bloques", ¿cómo podría escribir eso usando el formato de ruta genérico portátil? – Elpezmuerto

+0

@Elpez: No puede usar 'native_directory_string' ... No va a salir en el formato correcto. Puedo decir que su ruta de directorio final debería ser algo así como C:/juguetes/bloques. –

0

Uno de los métodos más utilizados para hacer esto es con un pre-processor directive. El enlace es para C pero se usan de la misma manera en C++. Advertencia razonable, cada compilador & OS puede tener su propio conjunto de directivas.

1

Mira en http://en.wikipedia.org/wiki/Uname

Si está utilizando g ++ como su compilador/GNU entonces usted podría intentar el código de abajo. entornos compatibles con POSIX apoyan esta:

#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 no tiene nada en el directorio '

+0

@Billy Por favor, lea http://en.wikipedia.org/wiki/Uname antes de un voto a favor. Mencioné g ++, y GNU lo admite. He compilado el código en g ++/CYGWIN. – Fanatic23

+0

@Billy ONeal: al usar MinGW o cygwin, Windows puede poseerlo. – doc

4

forma predeterminada, Visual #define s _WIN32 en la configuración del proyecto preprocesador estudio.

esta manera puede utilizar

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

predef.sourceforge.net es una colección completa de todo tipo de macros que identifican los sistemas operativos/compiladores y más. (vinculándose directamente al subsitio del sistema operativo)

Cuestiones relacionadas