Readdir и C++

Рейтинг: 0Ответов: 2Опубликовано: 22.01.2015

Есть код, который я нашел на просторах интернета. Главная цель кода - показать все файлы в главной папке и подпапках. Всё работает вроде хорошо (пока не появится 3-я подпапка). Автор, у которого я этот код позаимствовал, тоже мучался с данной ошибкой, но он смог её решить (и выложил этот код как решение данной проблены), но у меня ошибка всё равно осталась. Я решил сделать (понатыкать) проверок. Первая проверка показала, что входя в 3-ю подпапку цикл начинает попросту "крутить" пустоту. Потом я добавил вторую проверку, которая мне показала, что вся проблема в типе. Код полностью готов для копипаста. Просьба помочь!

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

void nextdir (char folder[255])
{
    DIR *dir;
    struct dirent *entry;
    dir=opendir(folder);
    printf("Открытие папки %s (тип: %d)\n",folder,entry->d_type);
       while ((entry=readdir(dir))!=NULL){
            printf("_\n");
            if (entry->d_type!=4) printf("%s\n",entry->d_name);else
                if ((entry->d_type==4) && ((strcmp(entry->d_name,".")!=0) && (strcmp(entry->d_name,"..")!=0))){
                    folder=strcat(folder,"/");
                    nextdir(strcat(folder,entry->d_name));
                }
        }
    closedir(dir);
}

int main(int argc, char **argv)
{
    char filename[256];
    if ( argc < 2 ) strcpy(filename, ".");
            else strcpy(filename, argv[1]);
    printf("Корневой каталог %s\n\n", filename);
    nextdir(filename);
    return 0;
}

Ответы

▲ 1

Хм.

nextdir(strcat(folder,entry->d_name));

Вы понимаете, что делает этот код? Он модифицирует folder на месте! Подумайте об этом, у вас всё время одна и та же область памяти для строки. Вы туда добавляете подкаталоги и никогда не удаляете по выходу из функции.

Не ленитесь, объявите параметр folder как const char, и выделяйте память для каждой новой строки.

И да, вы не детектируете ошибки, которые возвращают функции типа opendir. Вот почему никогда не стоит вслепую копипастить чужой код, не заглядывая в документацию.

▲ 1

@Georgy Linkovsky, это обычный (по своей идее) рекурсивный обход дерева в глубину (т.е. сразу как увидели каталог, так и перешли в него).

Только м.б. удобнее не конкатенировать имена оглавлений, а делать chdir(folder); сразу после opendir() (и вызывать просто nextdir(entry->d_name)), а перед возвратом вызывать chdir("..");

А у Вас что за идея (моделируете стек сами)?