2013-08-07 18 views
43

Belirli bir dizinin var olup olmadığını kontrol etmek istiyorum.Dizinin var olup olmadığını kontrol etmenin taşınabilir yolu [Windows/Linux, C]

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

Ama .. bir dizin olursa olsun ne varsa kontrol etmek için herhangi bir yolu var mı bunu yapmanın bir taşınabilir yol gerekir:

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

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

ve Linux: Windows üzerinde bunu nasıl biliyor OS kullanıyorum? Belki C standart kütüphane yolu?

Önişlemciler yönergelerini kullanabileceğimi ve bu işlevleri farklı işletim sistemlerinde çağırabileceğimi biliyorum, ancak bu çözüm için sorun değil.

EN AZ ŞİMDİLİK BU oluşturmuş oluruz:

#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

nasıl basitçe onun içinde (rastgele dosya adıyla) bir dosya oluşturmak için çalışıyor dersiniz? – stijn

cevap

62

stat() çalışır:

#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

Xubuntu 12.04 ve Windows XP'de bunu kontrol etti, teşekkürler, teşekkürler! – ivy

+0

@alk: emin misin? İlk yazıya bir örnek kod ekledim, herhangi bir önişlemci yönergesi olmaksızın (Xkuntu ve Windows üzerinde MinGW kullanıyorum) – ivy

+0

@alk Yayınlamadan önce denedim, hiçbir önişlemci yönergesi gerekli değil –

2

Kullanım boost::filesystem, sizin için şeyler ve soyut uzaklıkta çirkin detaylar o tip yapmanın taşınabilir yol vereceğini.

+2

Ama bu desteğin C++ ... – ivy

+0

için korktuğunu biliyorum, çünkü C'nin bunu yapmanın taşınabilir bir yolu olacağını düşünüyorum. Kodunuzun hangi işletim sistemi için derlendiğini kontrol etmek ve derlemek istediğiniz her işletim sistemini eklemek için '# define '' i kullanmanız yeterlidir. –

1

OS öğelerinden soyutlamak için GTK glib kullanabilirsiniz.

glib, hile yapması gereken g_dir_open() işlevini sağlar. . Hem Linux, UNIX ve Windows üzerinde

İlgili konular