2009-06-24 12 views

Odpowiedz

35

Poniższy kod wykorzystuje funkcję stat() i S_ISDIR („jest katalogiem”) i S_ISREG („jest zwykłym plikiem”) makra, aby uzyskać informacje na temat pliku. Reszta to po prostu sprawdzanie błędów i wystarczająca do stworzenia kompletnego programu do kompilacji.

#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; 
} 

Przykładowe przebiegi pokazane są tutaj:


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

Twój kod jest nieco kłopotliwy z powodu sprawdzania błędów. Sugeruję usunięcie tego i dodanie komentarza, np. "Sprawdź błędy: plik nie istnieje, za mało argumentów". Myślę, że to trochę poprawi twoją odpowiedź. –

+3

Wolę to od sprawdzania błędów, ponieważ często jest to pomijane w przykładach, a ludzie niekoniecznie wiedzą, jak go ponownie umieścić. –

+1

Zostawiłem to, ale wyjaśniono w tekście, jakie są ważne elementy. – paxdiablo

9

Użyj wywołania systemowego stat (2). Możesz użyć makra S_ISREG lub S_ISDIR w polu st_mode, aby sprawdzić, czy podana ścieżka jest plikiem lub katalogiem. Strona podręcznika informuje o wszystkich innych polach.

-1

Alternatywnie można użyć system() w funkcji z wbudowanym poleceń shell "test". System
zwraca kod zakończenia ostatniego polecenia wykonywane

 
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") ; 

ale obawiam się, to będzie działać tylko na linux ..

+2

Problematyczne, jeśli nazwa pliku zawiera białe znaki, myślę, że musiałbyś uciec przed tym. – Paggas

+3

Podczas gdy to zadziała, wydajność pozostawi wiele do życzenia. Każde wywołanie system() rozwidnia się, a następnie wykona nową powłokę, aby zinterpretować polecenie. –

5

Co na temat korzystania z biblioteki boost :: systemu plików i jej is_directory (const Path & p)? Zapoznanie się z nim może zająć trochę czasu, ale nie za bardzo. Prawdopodobnie jest wart inwestycji, a twój kod nie będzie zależny od platformy.