代码之家  ›  专栏  ›  技术社区  ›  Sebi95

如何仅计算路径中的目录数

  •  1
  • Sebi95  · 技术社区  · 8 年前

    我试图只计算路径中的目录数,但它不起作用。所以,我不想同时给文件和目录编号,我只想给目录编号。你能帮我吗? 代码:

    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;
    }
    
    2 回复  |  直到 8 年前
        1
  •  1
  •   Stian Skjelstad    8 年前

    stat()调用将失败,因为您不在正确的目录中。可以通过更改当前目录或生成完整路径并将stat作为参数来解决此问题。

    在某些Unix中,可以通过查看struct dirent(d_type字段)来优化stat调用

    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;
    }
    
        2
  •  0
  •   rio.irikami    8 年前

    我想你想要。。。

    • 用C编写
    • 计算路径中的目录数。
    • 计数函数将返回 int 价值

    我不了解您的环境,所以它只是一个示例解决方案。

    如果您可以使用 glob ,很容易计算目录的数量。即: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;
    }
    

    你可以这样尝试:

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

    然后您将收到如下输出:

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

    谢谢