0

我正在尝试获取文件夹中除文件之外的目录数,但我无法获得正确的结果。有人帮我解决这个问题吗?特别是我应该向 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);
}
4

2 回答 2

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);
于 2013-04-01T20:51:01.203 回答
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 );

希望能帮助到你!

于 2013-04-01T21:03:24.487 回答