2012-09-20 22 views
39

Come posso verificare se esiste una directory su Linux in C?Come posso verificare se esiste una directory?

+0

Eventuali duplicati di [modo più veloce C per verificare se esiste una directory] (http: // StackOverflow. it/questions/9314586/c -velocità-più veloce-per-verificare-se-una-directory-esistente) –

risposta

44

È possibile utilizzare opendir() e verificare se ENOENT == errno in caso di fallimento:

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. */ 
} 
+5

Per utilizzare questo, è necessario '#include '. –

+0

Se la cartella non esiste, come posso crearne una subito dopo averla confermata non esiste? – Pototo

+0

"errno" è incluso di default? Vedo che è definito in '#include ' in base alle pagine man – peter

8

Il modo migliore è probabilmente provare ad aprirlo, usando solo opendir() per esempio.

Si noti che è sempre meglio provare a utilizzare una risorsa di file system e gestire eventuali errori che si verificano perché non esiste, piuttosto che controllare e successivamente provare. C'è un'ovvia condizione di gara nell'ultimo approccio.

13

Si potrebbe utilizzare stat() e passare l'indirizzo di una struct stat, quindi controllare i suoi Stati st_mode per avere S_IFDIR set.

-5

Altri due modi, forse meno corretto è quello di utilizzare. Il primo, utilizzando solo le librerie standard e solo per i file:

FILE *f; 
f = fopen("file", "r") 
if(!f) 
    printf("there is no file there"); 

Questo si potrebbe lavorare su tutto il sistema operativo.

o un altro anche per dirs, utilizzando la chiamata di sistema con system(). È l'opzione peggiore, ma ti dà un altro modo. Per qualcuno forse utile.

+2

La domanda riguardava specificamente le directory, non i file. E ti consigliamo di chiamare 'system()', dovresti specificare quale argomento passare ad esso. –

+2

"*' printf ("non c'è file lì") "*": non essere in grado di aprire come file non significa necessariamente che non esiste. Turing intorno: il codice potrebbe non riuscire a 'fopen()' un file esistente, ad esempio a causa di problemi di accesso. – alk

4

Secondo man(2)stat è possibile utilizzare la macro S_ISDIR sul campo st_mode:

bool isdir = S_ISDIR(st.st_mode); 

Nota a margine, mi consiglia di utilizzare Boost e/o Qt4 per rendere il supporto cross-platform più facile se il software può essere vitale su altri sistemi operativi.

24

Utilizzare il codice seguente per verificare se esiste una cartella. Funziona su entrambe le piattaforme Linux di Windows &.

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

int main(int argc, char* argv[]) 
{ 
    const char* folderr; 
    //folderr = "C:\\Users\\SaMaN\\Desktop\\Ppln"; 
    folderr = "/tmp"; 
    struct stat sb; 

    if (stat(folderr, &sb) == 0 && S_ISDIR(sb.st_mode)) 
    { 
     printf("YES\n"); 
    } 
    else 
    { 
     printf("NO\n"); 
    } 
} 
+0

Sei sicuro che le intestazioni incluse siano sufficienti, almeno per Linux? – alk

1

Si può anche usare in combinazione con accessopendir per determinare se la directory esiste, e, se esiste il nome, ma non è una directory. Per esempio:

/* test that dir exists (1 success, -1 does not exist, -2 not dir) */ 
int 
xis_dir (char *d) 
{ 
    DIR *dirptr; 

    if (access (d, F_OK) != -1) { 
     // file exists 
     if ((dirptr = opendir (d)) != NULL) { 
      closedir (dirptr); 
     } else { 
      return -2; /* d exists, but not dir */ 
     } 
    } else { 
     return -1;  /* d does not exist */ 
    } 

    return 1; 
} 
-2

Sono d'accordo che la seguente intestazione sono una delle migliori soluzioni:

#include <stdio.h> 
#include <sys/stat.h> 
+5

Non hai bisogno di un codice di accompagnamento con le intestazioni per rispondere effettivamente alla domanda? –

+1

Questo non fornisce una risposta alla domanda. – alk

Problemi correlati