2009-06-24 12 views

risposta

35

Il codice seguente utilizza la funzione stat() e S_ISDIR ('è una directory') e S_ISREG ('è un file regolare') le macro per ottenere informazioni sul file. Il resto è solo un controllo degli errori e abbastanza per fare un programma compilabile completo.

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

int main (int argc, char *argv[]) { 
    int status; 
    struct stat st_buf; 

    // Ensure argument passed. 

    if (argc != 2) { 
     printf ("Usage: progName <fileSpec>\n"); 
     printf ("  where <fileSpec> is the file to check.\n"); 
     return 1; 
    } 

    // Get the status of the file system object. 

    status = stat (argv[1], &st_buf); 
    if (status != 0) { 
     printf ("Error, errno = %d\n", errno); 
     return 1; 
    } 

    // Tell us what it is then exit. 

    if (S_ISREG (st_buf.st_mode)) { 
     printf ("%s is a regular file.\n", argv[1]); 
    } 
    if (S_ISDIR (st_buf.st_mode)) { 
     printf ("%s is a directory.\n", argv[1]); 
    } 

    return 0; 
} 

piste del campione sono mostrati qui:


pax> vi progName.c ; gcc -o progName progName.c ; ./progName 
Usage: progName 
     where is the file to check. 

pax> ./progName /home 
/home is a directory. 

pax> ./progName .profile 
.profile is a regular file. 

pax> ./progName /no_such_file 
Error, errno = 2 
+0

il codice è un po 'macchinoso a causa del controllo degli errori. Suggerisco di rimuoverlo e aggiungere commenti come "verifica errori: file inesistente, argomenti non sufficienti". Penso che renderà la tua risposta un po 'migliore –

+3

Lo preferisco con il controllo degli errori, dato che spesso è lasciato fuori dagli esempi e le persone non sanno necessariamente come rimetterlo. –

+1

L'ho lasciato, ma chiarito nel testo quali sono i bit importanti. – paxdiablo

9

Utilizzare la chiamata di sistema stat (2). È possibile utilizzare la macro S_ISREG o S_ISDIR nel campo st_mode per verificare se il percorso specificato è un file o una directory. La pagina man ti dice di tutti gli altri campi.

-1

In alternativa è possibile utilizzare la funzione di sistema() con in "test" costruita comando di shell.
sistema restituisce lo stato di uscita del comando eseguito lo scorso

 
string test1 = "test -e filename" ; 
if(!system(test1)) 
printf("filename exists") ; 

string test2 = "test -d filename" ; 
if(!system(test2)) 
    printf("filename is a directory") ; 

string test3 = "test -f filename" ; 
if(!system(test3)) 
    printf("filename is a normal file") ; 

ma temo questo dovrebbe funzionare solo su linux ..

+2

Problematico se il nome del file contiene spazi vuoti, penso che dovresti scappare. – Paggas

+3

Mentre funzionerebbe, le prestazioni lasceranno molto a desiderare. Ogni chiamata a system() esegue il fork e quindi esegue una nuova shell per interpretare il comando. –

5

Cosa succede ad usare il boost :: biblioteca filesystem e la sua is_directory (Percorso const & p)? Potrebbe volerci un po 'per familiarizzare, ma non così tanto. Probabilmente vale l'investimento e il tuo codice non sarà specifico per la piattaforma.

Problemi correlati