Возникли проблемы с подсчетом количества байтов, используемых файлами в папке. Получение ошибки segfault - PullRequest
0 голосов
/ 31 января 2010

В настоящее время я пытаюсь подсчитать количество байтов, потребляемых файлами в определенном каталоге. Он рекурсивно просматривает все папки в текущем каталоге и подсчитывает байты файлов.

Когда я рекурсивно вызываю функцию rec_bytes, я печатаю «Go in» ... но когда она возвращает значение ... Она вызывает ошибки.

Я пометил проблемную строку в коде ниже.

Я думаю, что проблема связана с открытием / закрытием каталогов.

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

int rec_Bytes(char path[])
{
    int bytesSum = 0;
    printf("PathX %s\n", path);
    DIR *mydir = opendir(path); // Look in current directory

    struct dirent *entry = NULL;

    while((entry = readdir(mydir))) /* If we get EOF, the expression is 0 and
                                     * the loop stops. */
        {
        if (!isDir(entry->d_name))  // Check to see if the entry is a directory of a file
        {
            char tempPath[] = "";
            strcat(tempPath, path);
            strcat(tempPath,"/");
            strcat(tempPath,entry->d_name);
            int tempSum = fileSize(tempPath);   // Get file size
            bytesSum += tempSum;        // Add to sum
                printf("%s\t%d\n", entry->d_name, tempSum);
        }
        else    // The current entry is a directory
        {
            if ((strcmp((entry->d_name),"..") != 0) && (strcmp((entry->d_name),".")) != 0)
            {
                printf("Directory%s\n", entry->d_name);
                char tempPath[] = "";
                strcat(tempPath, path);
                strcat(tempPath,"/");
                strcat(tempPath,entry->d_name);
                printf("Go in\n");


                int tempSum = rec_Bytes(tempPath); <<<<<< Get segmentation fault here.


                printf("Come Out%d\n", tempSum);
                bytesSum += tempSum;
                    printf("%s\t%d\n", entry->d_name, tempSum);
            }
        }
        }
        closedir(mydir);
    printf("XXXX\t%s\t%d\n", path, bytesSum);
    return bytesSum;
}

// Thanks to : http://cboard.cprogramming.com/cplusplus-programming/117431-how-tell-if-file-directory.html
int isDir(const char* target)
{
   struct stat statbuf;
   stat(target, &statbuf);
   return S_ISDIR(statbuf.st_mode);
}

1 Ответ

4 голосов
/ 31 января 2010

Ваша проблема с такими строками ...

char tempPath[] = "";

Это выделит буфер с одним байтом, этот байт будет нулевым символом. В этом буфере нет места для более длинной строки.

По сути, C не имеет динамически изменяемых размеров строк. Он имеет строки с нулевым символом в конце, которые находятся в массивах символов фиксированного размера. Это создает проблему, когда вы, конечно, не будете знать длину строки, пока не закончите ее построение.

Попробуйте что-то вроде ...

char tempPath[5000] = "";

как быстрое решение. Кроме того, ищите strncat - это менее вероятно segfault. Также есть вариант printf, но в настоящее время я использую слишком много C ++.

EDIT

Фактически, segfault, вероятно, происходит из-за того, что strcats и printfs портят стек. Segfault, вероятно, когда функция пытается вернуться. Однако основная проблема заключается в слишком малом количестве строковых буферов.

Упс!

Самое быстрое решение - это ...

char tempPath[5000];
tempPath [0] = 0;

В противном случае он не всегда будет инициализирован пустой строкой, когда вы этого ожидаете.

...