如何获取目录中的目录数?

时间:2013-04-01 20:30:35

标签: c linux unix system

我正在尝试获取文件夹中除目录之外的目录数,但我无法获得正确的结果。有人帮我解决了这个问题吗?特别是我应该发送到isDirectory()函数?

int listFilesIndir(char *currDir) 
{
    struct dirent *direntp;


    DIR *dirp;
    int x ,y =0 ;


    if ((dirp = opendir(currDir)) == NULL) 
    {
        perror ("Failed to open directory");
        return 1;
    }

    while ((direntp = readdir(dirp)) != NULL)
    {
        printf("%s\n", direntp->d_name);
        x= isDirectory(dirp);
        if(x != 0)
            y++;
    }
    printf("direc Num : %d\n",y );

    while ((closedir(dirp) == -1) && (errno == EINTR)) ;

    return 0;
}


int isDirectory(char *path) 
{
    struct stat statbuf;

    if (stat(path, &statbuf) == -1)
        return 0;
    else 
        return S_ISDIR(statbuf.st_mode);
}

2 个答案:

答案 0 :(得分:1)

您正在向该函数发送目录流,并将其视为路径。

Linux和其他一些Unix系统包含了直接获取此信息的方法:

while ((direntp = readdir(dirp)) != NULL)
{
    printf("%s\n", direntp->d_name);
    if (direntp->d_type == DT_DIR)
       y++;
}

否则,请确保将正确的详细信息发送到该功能,即

x= isDirectory(direntp->d_name);

答案 1 :(得分:1)

对你的功能的调用是错误的。

x= isDirectory(dirp);

虽然功能原型是:

int isDirectory(char *path) 

它需要一个字符串作为参数,但你给它一个“DIR * dirp;”。我将代码更改为:

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <dirent.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>

int listFilesIndir(char *currDir)
{
    struct dirent *direntp;


    DIR *dirp;
    int x ,y =0 ;


    if ((dirp = opendir(currDir)) == NULL)
    {
        perror ("Failed to open directory");
        return 1;
    }

    while ((direntp = readdir(dirp)) != NULL)
    {
        printf("%s\n", direntp->d_name);
        if(direntp->d_type == DT_DIR)
            y++;
    }
    printf("direc Num : %d\n",y );

    while ((closedir(dirp) == -1) && (errno == EINTR)) ;

    return 0;
}

int main(int argc, char **argv){
    if(argc == 2){
        // Check whether the argv[1] is a directory firstly.
        listFilesIndir(argv[1]);
    }
    else{
        printf("Usage: %s directory", argv[0]);        
    }
    return 0;
}

我在我的Linux服务器上测试过它。它运作良好。所以@teppic是对的。但要注意,在代码中,目录的数量包括两个特定的“..”(父目录)和“。”。 (当前目录)。如果您不想包含它,可以更改:

printf("direc Num : %d\n",y );

成:

printf("direc Num : %d\n",y-2 );

希望它有所帮助!