2010-04-16 11 views

Répondre

1

Vous pouvez utiliser lstat et la S_ISDIR macro.

E.g. sans vérification d'erreur:

struct stat buffer; 
int status; 
char path[PATH_MAX]; 
DIR *dir = opendir(dir_name); 
... 
struct dirent *de = readdir(dir); 
sprintf(path, "%s/%s", dir_name, de->d_name); 
status = lstat(path, &buffer); 
if(S_ISDIR(buffer.st_mode)) 
{ 
    ... 
} 

EDIT: Correction d'inclure dans le répertoire lstat chemin (par el.pescado). Comme l'a noté R. Samuel Klatchko, vous voudrez peut-être adopter une approche de liste blanche (S_ISREG) au lieu de mettre en liste noire les types qui apparaissent.

+0

Vous devez combiner dirname et nom de fichier avant de passer le chemin vers lstat, par exemple. do sprintf (chemin, "% s /% s", nom_rép, de> nom_d); –

+1

Il serait un peu plus robuste de ne traiter que les entrées de fichiers régulières ('S_ISREG') plutôt que d'exclure les entrées de répertoire (' S_ISDIR'). De cette façon, si vous rencontrez un autre type d'entrée, vous ne le traiterez pas accidentellement. –

+0

Et juste remarqué quelque chose d'autre. Vous devez penser à utiliser 'stat' ou' lstat'. Si vous avez un lien symbolique vers un fichier réel, voulez-vous le traiter ou l'ignorer? Si vous voulez l'ignorer, utilisez 'lstat' pour que vous sachiez qu'il s'agit d'un lien symbolique. Si vous ne vous souciez pas d'être un lien symbolique et souhaitez le traiter en supposant qu'il s'agit d'un lien symbolique vers un fichier normal, utilisez 'stat'. –

0
`void DirectryNFileCount(const char * FileDir) 
{ 
    DIR *dir; 
    int filecount; 
    int dircount; 
    struct dirent *direntry; 
    if ((dir = opendir (FileDir)) == NULL) 
    { 
    /*Error code*/ 
    } 
while((direntry = readdir (dir)) != NULL) 
{ 
if(direntry->d_type==DT_DIR) 
dircount++; 
/*do something with directries  */ 
} 
else 
{ 
    filecount++; 
    std::cout<<"Files Names"<<direntry->d_name<<std::endl; 
} 
} 
    std::cout<<"THIS Directory has "<<filecount<<" FILES and "<<dircount<< " DIRECTORIES"; 
} 
+1

Une explication écrite accompagnant votre code rendrait cette réponse plus utile. – nbryans