Рекурсивный подсчет файлов и всех каталогов по заданному каталогу - PullRequest
1 голос
/ 25 февраля 2020

Я работал над этим проектом, и я застрял в одной из строк этого кода.

Это в основном подсчитывает файлы и количество каталогов рекурсивно по каталогам, используя C++ в UNIX, но всякий раз, когда я делаю рекурсивный вызов, появляется сообщение об ошибке:

Segmentation fault (core dumped)

Я думал, что это потому, что я не проверял "." и ".." но это было не так.

Что-то не так с рекурсивным вызовом?

#include <string>
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>
#include <iostream>

using namespace std;


void cntFile(string it, int &reg, int &der, size_t &size)
{
    DIR * dirp;
    struct dirent *entry;
    struct stat file_stats;

    dirp = opendir(it.c_str());
    while ((entry = readdir(dirp)) != NULL)
    {
        if (entry->d_type == DT_REG)
        {
            reg++;
            stat(getcwd(entry->d_name,sizeof(entry->d_name)), &file_stats);
            size += (unsigned int) file_stats.st_size;

        }
        else if (entry->d_type == DT_DIR)
        {  

           if(string(entry->d_name) != ".." | string(entry->d_name) != ".")
            {
                string temp;
                temp.append(it + entry->d_name + "/");
                cntFile(temp, reg, der, size);
            }
           der++;
        }
    }
    closedir(dirp); 
}

int main (void)
{
    int reg = 0;
    int der = 0;
    size_t size = 0;
    string it = "/usr/share/";
    cntFile(it, reg, der, size);
    printf("The total number of directories in directory is %d \n", reg);
    printf("The total number of files in directory is %d \n", der);
    printf("The total number of bytes occupied by all files in directory is %zu\n", size);
    return 0;
}

1 Ответ

2 голосов
/ 25 февраля 2020

Существует одна серьезная проблема в том, как вы используете readdir и структуру, на которую он возвращает указатель.

Из ссылки, указанной выше:

Приложение не должно изменять структуру, на которую указывает возвращаемое значение readdir(), ни области хранения, на которые указывают указатели в структуре.

И все же это именно то, что вы делаете с помощью вызова getcwd измените содержимое элемента структуры d_name.

Если вы хотите изменить содержимое имени в d_name, вам нужно создать свой собственный локальное копирование и использование этого.

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