2016-10-30 3 views
0

Ich muss Einträge ignorieren, die Unterverzeichnisse sind. Wie kann das gehen? Ich denke, ich muss S_ISDIR(s.st_mode) verwenden, aber ich weiß nicht wie. Kannst du mir bitte helfen?So ignorieren Sie Unterverzeichnisse beim Auflisten von Verzeichniseinträgen in Linux C

Hier ist mein Code:

void recorrer_directorio(char *dir_name) { 
    DIR *dir = NULL; 
    struct dirent *ent; 
    char fich[1024]; 
    char buff[4096]; 
    int fd; 

    /* OPEN DIRECTORY */ 
    /*ESTO ES MI CODIGO*/ 
    dir = opendir(dir_name); 

    /* TREATMENT OF ERROR */ 
    if (dir == NULL) { 
     printf("aqui esta mi error"); 
     perror("Recorrer_Directorio : opendir()"); 
     exit(1); 
    } 

    while ((ent = readdir(dir)) != NULL) { 
     /* Nos saltamos las que comienzan por un punto "." */ 
     if (ent->d_name[0] == '.') 
      continue; 

     /* PATH OF FILE*/ 
     realpath(ent->d_name, fich); 
     printf("MI RUTA COMPLETA DE FCHERO [%s]\n", fich); 

     /* IGNORE DIRECTORY PATH */ 
     .......... 
    } 
}    
+0

Reguläre Dateien können mit '.' beginnen, wobei sie möglicherweise nicht in Ordnung sind. Sie könnten nach "." und ".." explizit, aber Sie benötigen eine generische Lösung für andere Einträge. – chqrlie

+0

Verwenden Sie 'realpath' auch nicht auf diese Weise: es funktioniert nur für das aktuelle Verzeichnis. Verwenden Sie die Verkettung, wie von P.P. und benutze 'realpath' auf dem resultierenden Puffer, wenn überhaupt notwendig. – chqrlie

+0

Schließlich vergessen Sie nicht die 'closedir()', um zu vermeiden, leckere Griffe zu verlieren. – chqrlie

Antwort

1

Sie d_type verwenden können, um den Dateityp zu erhalten, wenn es auf Ihrem System unterstützt wird:

if (ent->d_type == DT_DIR) { 
    /* ent->d_name is a directory. */ 
} 

Andernfalls können Sie stat(2) wie folgt verwenden:

#include <sys/types.h> 
#include <sys/stat.h> 
#include <unistd.h> 

... 

char buf[4096]; 
snprintf(buf, sizeof buf, "%s/%s", dir_name, ent->d_name); 
struct stat sb; 

if (stat(buf, &sb) == 0 && S_ISDIR(sb.st_mode)) { 
    /* d_name is a directory. */ 
} 
+0

danke! Ich habe versucht, stat zu verwenden, konnte aber nicht für die Bibliothek – guille

Verwandte Themen