2013-08-07 13 views
43

Vorrei verificare se esiste una directory specifica. So come fare questo su Windows:Modo portatile per verificare se la directory esiste [Windows/Linux, C]

BOOL DirectoryExists(LPCTSTR szPath) 
{ 
    DWORD dwAttrib = GetFileAttributes(szPath); 

    return (dwAttrib != INVALID_FILE_ATTRIBUTES && 
     (dwAttrib & FILE_ATTRIBUTE_DIRECTORY)); 
} 

e Linux:

DIR* dir = opendir("mydir"); 
if (dir) 
{ 
    /* Directory exists. */ 
    closedir(dir); 
} 
else if (ENOENT == errno) 
{ 
    /* Directory does not exist. */ 
} 
else 
{ 
    /* opendir() failed for some other reason. */ 
} 

Ma ho bisogno di un modo di fare questo portatile .. C'è un modo per verificare se esiste una directory non importa quale Sistema operativo sto usando? Forse la libreria standard C?

So che posso utilizzare le direttive dei preprocessori e chiamare tali funzioni su sistemi operativi diversi ma questa non è la soluzione che sto chiedendo.

io alla fine con questo, almeno per ora:

#include <sys/types.h> 
#include <sys/stat.h> 
#include <stdio.h> 
#include <stdlib.h> 

int dirExists(const char *path) 
{ 
    struct stat info; 

    if(stat(path, &info) != 0) 
     return 0; 
    else if(info.st_mode & S_IFDIR) 
     return 1; 
    else 
     return 0; 
} 

int main(int argc, char **argv) 
{ 
    const char *path = "./TEST/"; 
    printf("%d\n", dirExists(path)); 
    return 0; 
} 
+0

che ne dite di semplicemente cercando di creare un file (con un nome a caso) in esso? – stijn

risposta

62

stat() opere su Linux, UNIX e Windows, nonché:.

#include <sys/types.h> 
#include <sys/stat.h> 

struct stat info; 

if(stat(pathname, &info) != 0) 
    printf("cannot access %s\n", pathname); 
else if(info.st_mode & S_IFDIR) // S_ISDIR() doesn't exist on my windows 
    printf("%s is a directory\n", pathname); 
else 
    printf("%s is no directory\n", pathname); 
+1

Controllato su Xubuntu 12.04 e Windows XP, ha funzionato, grazie! – ivy

+0

@alk: sei sicuro? Ho aggiunto un codice di esempio al mio primo post, ha funzionato senza alcuna direttiva preprocessore senza avvisi (utilizzo gcc su Xubuntu e MinGW su Windows) – ivy

+0

@alk ho provato prima di pubblicare, nessuna direttiva preprocessore necessaria –

2

Usa boost::filesystem, che vi darà un modo portabile di fare questo tipo di cose e astratte via tutti i brutti dettagli per voi.

+2

Ma temo che la spinta sia per il C++ ... – ivy

+0

oh dubito che in C ci sia un modo portatile per farlo. Dovrai semplicemente usare '# define' per verificare quale sistema operativo viene compilato il tuo codice e aggiungerlo per ogni sistema operativo che desideri compilare. –

1

È possibile utilizzare lo GTK glib per astrarre da materiale OS.

glib fornisce una funzione g_dir_open() che dovrebbe fare il trucco.

Problemi correlati