Есть код, который я нашел на просторах интернета. Главная цель кода - показать все файлы в главной папке и подпапках. Всё работает вроде хорошо (пока не появится 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;
}
Хм.
nextdir(strcat(folder,entry->d_name));
Вы понимаете, что делает этот код? Он модифицирует folder
на месте! Подумайте об этом, у вас всё время одна и та же область памяти для строки. Вы туда добавляете подкаталоги и никогда не удаляете по выходу из функции.
Не ленитесь, объявите параметр folder
как const char
, и выделяйте память для каждой новой строки.
И да, вы не детектируете ошибки, которые возвращают функции типа opendir
. Вот почему никогда не стоит вслепую копипастить чужой код, не заглядывая в документацию.
@Georgy Linkovsky, это обычный (по своей идее) рекурсивный обход дерева в глубину (т.е. сразу как увидели каталог, так и перешли в него).
Только м.б. удобнее не конкатенировать имена оглавлений, а делать chdir(folder);
сразу после opendir()
(и вызывать просто nextdir(entry->d_name)
), а перед возвратом вызывать chdir("..");
А у Вас что за идея (моделируете стек сами)?
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Изучаю библиотеку GLUTСоздаётся впечатление, что в GLUT отрисовка и события работают параллельно, создавая многозадачность?
Собираю маленький игровой сервер и никак не мог понять, почему он иногда не работает, почти один и тот же код в разных проектахИ вот методом...