2016-04-27 9 views
1

Ich versuche, nur die Verzeichnisse aus einem Pfad zu zählen, aber es funktioniert nicht. Also, ich möchte nicht beide Dateien und Verzeichnisse nummerieren, ich will nur die Verzeichnisse. Kannst du mir bitte helfen? Der Code:Wie zähle ich nur die Anzahl der Verzeichnisse von einem Pfad

int listdir(char *dir) { 
    struct dirent *dp; 
    struct stat s; 
    DIR *fd; 
    int count = 0; 

    if ((fd = opendir(dir)) == NULL) { 
     fprintf(stderr, "listdir: can't open %s\n", dir); 
    } 
    while ((dp = readdir(fd)) != NULL) { 
     if (!strcmp(dp->d_name, ".") || !strcmp(dp->d_name, "..")) 
      continue; 
     stat(dp->d_name, &s); 
     if (S_ISDIR(s.st_mode)) 
     count++; 
    } 
    closedir(fd); 
    return count; 
} 
+0

Verwendung 'S_ISREG()' zu sagen, ob ein Verzeichnis-Eintrag ist eine reguläre Datei, sonst ist es optimieren weg (oder ein Link). – ocket8888

+0

Es funktioniert nicht ... – Sebi95

Antwort

1

Ihr Aufruf stat() wird fehlschlagen, da Sie nicht im richtigen Verzeichnis sind. Dies können Sie lösen, indem Sie entweder das aktuelle Verzeichnis ändern oder vollständige Pfade generieren und stat als Argument übergeben.

Einige Unix-Varianten, können Sie ein Verzeichnis den stat-Aufruf durch einen Blick auf struct dirent, das d_type Feld

int listdir(char *dir) { 
    struct dirent *dp; 
    struct stat s; 
    DIR *fd; 
    int count = 0; 

    if ((fd = opendir(dir)) == NULL) { 
     fprintf(stderr, "listdir: can't open %s\n", dir); 
    } 
    chdir (dir); /* needed for stat to work */ 
    while ((dp = readdir(fd)) != NULL) { 
     if (!strcmp(dp->d_name, ".") || !strcmp(dp->d_name, "..")) 
      continue; 
#ifdef _DIRENT_HAVE_D_TYPE 
     switch (dp->d_type) 
     { 
      case DT_UNKNOWN: 
      stat(dp->d_name, &s); 
      if (S_ISDIR(s.st_mode)) count++; 
      break; 
      case DT_DIR: 
      count++; 
      break; 
     } 
#else 
     stat(dp->d_name, &s); 
     if (S_ISDIR(s.st_mode)) count++; 
#endif    
    } 
    closedir(fd); 
    return count; 
} 
+0

könnten Sie ein wenig erklären, wie es geht? – Sebi95

+0

Stian, wie kann ich chdir auf Windows verwenden? – Sebi95

+0

ersten Treffer auf Google zeigt https://msdn.microsoft.com/en-us/library/ms235420.aspx und https://msdn.microsoft.com/en-us/library/bf7fwze1.aspx –

0

Ich glaube, Sie wollen ...

  • in C geschrieben
  • die Anzahl der directoriesfrom einen Pfad zählen.
  • Die Zählfunktion gibt int Wert zurück.

Ich habe keine Ahnung von Ihrer Umgebung, also ist es nur eine Beispiellösung.

Wenn Sie glob verwenden können, ist es so einfach, die Anzahl der Verzeichnisse zu zählen. das heißt: main.c

#include <stdio.h> 
#include <glob.h> 
#include <string.h> 

#define MAX_PATH 1023 

int countDirectories(char* dir) 
{ 
    char path[MAX_PATH] = ""; 
    strcat(path, dir); 
    strcat(path, "/*"); 

    glob_t globbuf; 
    long i, count = 0; 

    if (glob(path, GLOB_NOSORT | GLOB_ONLYDIR, NULL, &globbuf) == 0) 
    { 
     count = globbuf.gl_pathc; 
     for (i = 0; i < globbuf.gl_pathc; i++) 
     { 
      count += countDirectories(globbuf.gl_pathv[i]); 
     } 
    } 
    globfree(&globbuf); 

    return count; 
} 

int main(int argc, char* argv[]) 
{ 
    int count; 

    if (argc > 1) 
    { 
     count = countDirectories(argv[1]); 
    } 
    else 
    { 
     count = countDirectories("."); 
    } 

    printf("there are %d directories.\n", count); 

    return 0; 
} 

und Sie können diese wie versuchen:

> gcc main.c -o testglob 
> ./testglob /path/to/target/dir 

dann werden Sie Ausgabe wie folgt erhalten:

path = /path/to/target/dir/*, there are N directories 

Dank.

+0

Sorry, aber ich kann nicht verstehen, was Sie hier tun ... – Sebi95

+0

bearbeitet :) Sie können meine 'countDirectories' als Ihre' listdir' Funktion verwenden. 'glob' ist die Funktion sucht Dateien/Verzeichnisse nach _pattern_. und mit dem Flag 'GLOB_ONLYDIR' können wir nur das Verzeichnis durchsuchen. Als Ergebnis davon können Sie die Anzahl der Verzeichnisse im 'Pfad' finden. –

Verwandte Themen