2013-08-07 23 views
43

Chciałbym sprawdzić, czy dany katalog istnieje. Wiem, jak to zrobić w systemie Windows:Przenośny sposób sprawdzania, czy istnieje katalog [Windows/Linux, C]

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

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

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

Ale muszę przenośny sposób to zrobić .. Czy istnieje jakiś sposób, aby sprawdzić, czy katalog istnieje bez względu na to, co Używasz OS? Może sposób C standardowej biblioteki?

Wiem, że mogę używać dyrektyw preprocesorów i wywoływać te funkcje w różnych systemach operacyjnych, ale to nie jest rozwiązanie, o które pytam.

I skończyć z tym, przynajmniej na razie:

#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

jak o po prostu próbuje utworzyć plik (o losowej nazwie pliku) w nim? – stijn

Odpowiedz

62

stat() działa na Linux, UNIX i Windows, jak również.

#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

Sprawdzone na Xubuntu 12.04 i Windows XP, działało, dziękuję! – ivy

+0

@alk: jesteś pewien? Dodałem przykładowy kod do mojego pierwszego posta, działało bez żadnych dyrektyw preprocesora bez ostrzeżeń (używam gcc na Xubuntu i MinGW na Windows) – ivy

+0

@alk Próbowałem przed wysłaniem, nie potrzebowałem dyrektyw preprocesora –

2

użytkowania boost::filesystem, że daje przenośne sposób prowadzenia tego rodzaju rzeczy i abstrakcyjnych od wszystkich brzydkich informacji dla Ciebie.

+2

Ale obawiam się, że zwiększenie jest dla C++ ... – ivy

+0

oh Wątpię, że w C będzie przenośny sposób, aby to zrobić. Musisz tylko użyć '# define', aby sprawdzić, do którego systemu operacyjnego jest kompilowany twój kod i dodać go do każdego systemu operacyjnego, dla którego chcesz skompilować. –