递归计算目录中的所有文件(包括子目录中的文件)

时间:2019-07-06 14:40:23

标签: c linux

我正在执行一项功能,该功能计算目录中文件的数量(包括子目录和该子目录中的文件)。例如:

Base / Dir 1 / Dir 1.1

目录1具有:hi.txt,hi2.txt

Dir 1.1具有:hi3.txt,hi4.txt,hi5.txt

因此,Base中文件数量的输出应为7(忽略。和..)

目录1中的文件数输出应为6

目录2中的文件数输出应为3

这是我试图做的。

void recorrido(const char *actual, int indent, int op, char * output,int numF)
{
    DIR *dir;
    struct dirent *entrada;


    char path[PATH_MAX+1];
    char path2[PATH_MAX+1];

    if (!(dir = opendir(actual))){
        return;
    }


    while ((entrada = readdir(dir)) != NULL)
    {

        if (entrada->d_type == DT_DIR) //Directory
        {
            if ((strcmp(entrada->d_name, ".") != 0) && (strcmp(entrada->d_name, "..") != 0)) //Ignore . and ..
            {

                strcpy(path, actual);
                strcat(path, "/");
                strcat(path, entrada->d_name);


                recorrido(path, indent + 2,op,output,numF++);
                printf("Number of files for %s is %d", path, numF);
            }
        }
    }

 else if (entrada->d_type != DT_DIR){ //just file

            if (strcmp(actual, "") == 0){
                strcpy(path2, "./"); 
                strcat(path2, entrada->d_name);
                strcpy(actual, path2);
            }
            else
            {
                strcpy(path2, actual);
                strcat(path2, "/");
                strcat(path2, entrada->d_name);
                //printf("File path is %s\n",path2);
                numF++;
            }
        }


    closedir(dir);

}

我在为每个目录打印适当数量的文件时遇到问题,如果我在基本目录(测试1和测试2)中有2个文件夹,它将考虑这些文件夹,但是如果我在测试1中具有某些内容,它将忽略它

1 个答案:

答案 0 :(得分:1)

如评论中所述,您需要返回增加的值。

  1. 更改功能签名:

    int recorrido(const char *actual, int indent, int op, char *output, int numF)
    
  2. 更改函数调用自身的方式:

    numF = recorrido(path, indent + 2, op, output, numF + 1);
    
  3. 返回修改后的值:

    …
    if (! (dir = opendir(actual))) {
        return numF;
    }
    …
    
        …
        closedir(dir);
        return numF;
    }
    
  4. …并更改函数的调用方式。

我也强烈建议您不要混用语言(请坚持使用英语来编写代码和注释!),而要花时间整齐而一致地格式化代码(尤其是缩进和空格)。您代码的读者(包括您自己!)将感谢您-实际上,格式清晰的代码不是可选的,几乎在所有地方都强制执行了