2010-02-04 3 views
13

Actuellement, j'ai un code comme (condensé et retiré un tas d'erreurs de vérification):façon mutualisées de vérifier si un fichier est un répertoire

dp = readdir(dir); 
if (dp->d_type == DT_DIR) { 
} 

Cela fonctionne à merveille sur ma machine Linux. Cependant sur une autre machine (qui ressemble à SunOS, sparc):

SunOS HOST 5.10 Generic_127127-11 sun4u sparc SUNW,Ultra-5_10 

Je reçois l'erreur suivante au moment de la compilation:

error: structure has no member named `d_type' 
error: `DT_DIR' undeclared (first use in this function) 

Je pensais que l'en-tête dirent.h était multiplate (pour les machines POSIX). Aucune suggestion.

+0

Quand je vois multi-plateforme, j'ai tendance à supposer que vous voulez dire Windows et éventuellement OS/2. :-) La réponse pour Posix est simple, et quelqu'un l'a déjà donné. – Omnifarious

Répondre

18

Ref http://www.nexenta.org/os/Porting_Codefixes:

La définition de struct en dirent solaris ne contient pas le champ d_type. Vous devrez effectuer les modifications comme suit

if (de->d_type == DT_DIR) 
{ 
    return 0; 
} 

changements

struct stat s; /*include sys/stat.h if necessary */ 
.. 
.. 
stat(de->d_name, &s); 
if (s.st_mode & S_IFDIR) 
{ 
    return 0; 
} 

Depuis stat est également la norme POSIX il devrait être plus multiplateforme. Mais vous pouvez utiliser if ((s.st_mode & S_IFMT) == S_IFDIR) pour suivre la norme.

+9

En fait, POSIX définit une macro pour cela: 'if (S_ISDIR (s.st_mode))'. Bien sûr, vous devriez vérifier que 'stat()' réussit en premier. – mark4o

+0

Notez que fstatat (2) peut être plus préférable à stat (2), car 'de> nom_d est relatif au répertoire ouvert. – Igor

Questions connexes