Подсчитать все файлы в каталоге (включая файлы в подкаталоге) рекурсивно - PullRequest
1 голос
/ 06 июля 2019

Я делаю функцию, которая подсчитывает количество файлов в каталоге (включая подкаталоги и файлы внутри этого подкаталога).Например:

База / Dir 1 / Dir 1.1

Dir 1 имеет: hi.txt, hi2.txt

Dir 1.1 имеет: hi3.txt, hi4.txt, hi5.txt

Таким образом, вывод для количества файлов в Base должен быть 7 (игнорируя. и ..)

Вывод для количества файлов в Dir 1 должен быть 6

Вывод количества файлов в Dir 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);

}

У меня проблемы с печатью правильного количества файлов длякаждый каталог, если у меня есть 2 папки внутри базы (тест 1 и тест 2), он будет учитывать эти папки, но если у меня есть что-то внутри теста 1, он будет игнорироваться.

1 Ответ

1 голос
/ 06 июля 2019

Как отмечено в комментариях, вам необходимо вернуть увеличенное значение.

  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. … И измените способ вызова функции.

Я также настоятельно рекомендую не смешивать язык (придерживайтесь английского языка для кода и комментариев!) И тратить время на чистое и последовательное форматирование кода (особенно отступы и пробелы).Читатели вашего кода (включая вас!) Будут вам благодарны - на самом деле, чисто отформатированный код не является обязательным, он применяется без исключения практически везде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...