2010-07-09 38 views
17

Sto scrivendo una funzione compatibile in più piattaforme in C++ che crea directory basate su nomi di file di input. Devo sapere se la macchina è Linux o Windows e usare la barra appropriata in avanti o indietro. Per il seguente codice qui sotto, se la macchina è Linux, allora isLinux = true. Come posso determinare il sistema operativo?Determinare se Linux o Windows in 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

Se non si intende mostrare il percorso all'utente, è possibile mantenerlo semplice e utilizzare solo una barra in avanti a prescindere. Windows capisce entrambi. (Se * fai * piano su mostrarlo, però, probabilmente dovresti usare i backslash su Windows - sembra più bello essere coerenti con il sistema operativo.) –

risposta

32

Usa:

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

BTW, è comunque possibile utilizzare in modo sicuro questo slash "/" su Windows come Windows capisce perfettamente. Quindi limitarsi a "/" barra risolverebbe i problemi per tutti i sistemi operativi, come OpenVMS, dove il percorso è foo:[bar.bee]test.ext può essere rappresentato come /foo/bar/bee/test.ext.

+5

Esistono alcune funzioni Win32 a cui non piace il carattere separatore di directory Win32 errato "/". Ma se usi le funzioni Win32, probabilmente già sai che stai prendendo di mira Windows. –

+0

@Andreas, quali funzioni di Win32 hanno problemi con "/"? – Tomas

+4

Con "pochi" intendo veramente "pochi" ... :) Penso che alcuni di questi siano sensibili: http://msdn.microsoft.com/en-us/library/bb773559(VS.85).aspx In Inoltre, c'è un avvertimento esplicito qui: http://msdn.microsoft.com/en-us/library/ms684175(VS.85).aspx. Tuttavia, la cosa principale che ho contro lo slash è che mi fa male agli occhi quando vedo uno di quelli in un percorso Microsoft Windows ... –

13

In generale, si dovrebbe fare questo con la compilazione condizionale.

Detto questo, se si utilizza boost::filesystem si dovrebbe usare il portable generic path format in modo da poter dimenticare cose come questa.

+0

Non sono sicuro di aver capito l'esempio " OpenVMS:" SYS1 :: DISK1: [JANE.TYLER.HARRY] "è considerato un nome di percorso nativo con un nome di sistema, un nome di unità e tre nomi di file di directory, anziché un percorso portatile con un nome file. - Windows:" c: \\ jane \\ tyler \\ harry "è considerato come un percorso nativo con una lettera di unità, directory radice e tre nomi di file, piuttosto che un percorso portatile con un nome file. if full_path.native_directory_string() = c: \\ giocattoli e voglio creare una cartella "blocchi", quindi come dovrei scrivere usando il formato di percorso generico portatile? – Elpezmuerto

+0

@Elpez: non è possibile utilizzare 'native_directory_string' ... Non verrà prodotto nel formato corretto. Posso dire che il tuo percorso di directory finale dovrebbe essere qualcosa come C:/toys/blocks. –

0

Uno dei metodi più utilizzati per farlo è con un pre-processor directive. Il collegamento è per C ma vengono utilizzati allo stesso modo in C++. Un avvertimento equo, ogni compilatore & OS può avere il proprio insieme di direttive.

1

Guardare in http://en.wikipedia.org/wiki/Uname

Se si utilizza g ++ come il compilatore/GNU allora si potrebbe provare il codice qui sotto. ambienti compatibili POSIX supportano questa:

#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 non ha nulla nella directory '

+0

@Billy Si prega di leggere http://en.wikipedia.org/wiki/Unome prima di un downvote. Ho citato g ++ e GNU supporta questo. Ho compilato il codice su g ++/CYGWIN. – Fanatic23

+0

@Billy ONeal - quando si utilizza MinGW o cygwin, Windows può possederlo. – doc

4

Per impostazione predefinita, Visual Studio #define s _WIN32 nelle impostazioni del progetto preprocessore.

modo da poter utilizzare

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

predef.sourceforge.net è una raccolta completa di tutti i tipi di macro che identificano compilatori/sistemi operativi e altro ancora. (collegamento diretto al sito secondario del sistema operativo)

Problemi correlati