Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > C++ Builder
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.05.2013, 18:11   #1
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию Поиск файлов без рекурсии

Классический вариант с рекурсией примерно такой:
Код:
// Для поиска файлов в каталоге и его подкаталогах напишите следующий код:
void ListFiles(AnsiString path, TStrings* List)
{
// Эта процедура выводит список файлов и вызывает
// саму себя для всех каталогов
TSearchRec sr;
if (FindFirst(path+"*.*", faAnyFile, sr) == 0)
{
 do
 {
 if (sr.Attr & faDirectory)
  {
  if (sr.Name!=".")
  if (sr.Name!="..")
   {
	AnsiString Ext=ExtractFileExt(sr.Name).UpperCase();
   if ((Ext==".avi") | (Ext==".wmv") | (Ext==".mpg")|(Ext==".mp4"))
   List->Add(path+sr.Name);
   else ListFiles(path+sr.Name+"\\",List);// Рекурсивный вызов
   }
   }
 }
 while (FindNext(sr) == 0);
 FindClose(sr);
}
Application->ProcessMessages();
}
Я хочу сделать чтобы поиск файлов проходил с определенной глубиной вложенности,т.е. к примеру C:\Folder1\Folder2\Folder3 - достаточно.
На Visual Basic есть код с использованием For Each folder in root.subfolders, а на с++ только рекурсия?
calypso вне форума Ответить с цитированием
Старый 24.05.2013, 18:37   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Не обязательно рекурсией - можно сделать очередь и при посмотре одной папки добавляем новые в очередь и работаем пока очередь не закончится.
Глубину промостра можно делать той же рекурсией, просто добавив дополнительный аргумент счетчик глубины и если дойдем до конца, дальнейшие папки не просматриваются.
waleri вне форума Ответить с цитированием
Старый 24.05.2013, 20:24   #3
Avazart
Форумчанин
 
Аватар для Avazart
 
Регистрация: 13.08.2011
Сообщений: 184
По умолчанию

Считай вложенность что мешает ? и чем рекурсия не угодила то ?
Avazart вне форума Ответить с цитированием
Старый 24.05.2013, 20:53   #4
calypso
Форумчанин
 
Регистрация: 02.12.2012
Сообщений: 250
По умолчанию

В книгах по программированию пишут что рекурсию следует использовать только в крайних случаях т.к. это признак непрофессионализма. Почему так - хз, возможно из-за возможного зацикливания кусков программы.
Цитата:
можно сделать очередь и при посмотре одной папки добавляем новые в очередь и работаем пока очередь не закончится.
Надо каждый раз дергать FindFirstFile? В VBA все проще делалось: написал функцию поиска файлов в данной папке,и вызываешь её каждый раз для папка.subfolders.
calypso вне форума Ответить с цитированием
Старый 24.05.2013, 22:05   #5
FataLL
Форумчанин
 
Аватар для FataLL
 
Регистрация: 29.01.2013
Сообщений: 319
По умолчанию

calypso
Это рекурсия - не профессионализм? Не знаю, кто сейчас пишет книги по программированию, но немного раньше рекурсия преподносилась ближе к концу, либо в примерах повышенной сложности. На мой личный взгляд - удобнейшая вещь, без которой порой просто не обойтись.

А откуда, простите, берутся папка.subfolders? Их на ухо Купидон нашёптывает? То, что БАСИЦ снял с программиста "тяжёлую ношу", ещё не значит, что он по-другому эти папки ищет...
FataLL вне форума Ответить с цитированием
Старый 24.05.2013, 22:58   #6
Гром
Старожил
 
Аватар для Гром
 
Регистрация: 21.03.2009
Сообщений: 2,193
По умолчанию

Алгоритмы работы с древовидными структурами по природе своей рекурсивны. Можно извращаться и писать как-то по-другому, как, например с очередью посоветовали, но это будет достаточно искусственный прием и придется усложнить алгоритм. К примеру, каждый элемент очереди еще должен бы помнить свой собственный адрес, чтобы найти полный путь к нужному нам файлу. Рекурсивные алгоритмы в этой задаче гораздо более естественны и потому предпочтительны.
Быстрая сортировка, так всеми любимая, тоже рекурсивна.

Другое дело, что надо знать, когда применять рекурсию, а когда не стоит. Не дай вам бог считать, например, числа Фибоначчи рекурсивно...
Простые и красивые программы - коды программ + учебник C++
Создание игры - взгляд изнутри - сайт проекта
Тема на форуме, посвященная ему же
Гром вне форума Ответить с цитированием
Старый 25.05.2013, 11:52   #7
Airhand
Пользователь
 
Аватар для Airhand
 
Регистрация: 23.08.2011
Сообщений: 55
По умолчанию

Отвечаю многим почему рекурсия признак плохого алгоритма: при рекурсии происходит вызов функции, а при этом юзается статическая память (я не помню уже сколько) . А статики – килобайты, а не гигабайты как динамики. Уверенны что её хватит ?
Где-то читал, что любую рекурсию можно переделать под цикл.
"Пока бабка не смоет косметику, русский мужик не перекрестится" (C) Кто-то
Airhand вне форума Ответить с цитированием
Старый 25.05.2013, 12:10   #8
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Можно и без рекурсии обойтись. Используйте stack из библиотеки VCL. Правда это более геморно чем, если использовать рекурсивный алгоритм.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 25.05.2013, 13:28   #9
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Цитата:
Сообщение от Airhand Посмотреть сообщение
вызов функции, а при этом юзается статическая память
Вообще-то юзается стек.
waleri вне форума Ответить с цитированием
Старый 25.05.2013, 13:58   #10
Airhand
Пользователь
 
Аватар для Airhand
 
Регистрация: 23.08.2011
Сообщений: 55
По умолчанию

При рекурсии юзается стек статической памяти (я точно не помню, но что-то около 64 килобайт; сравните с динамической, которой могут быть гигабайты).
"Пока бабка не смоет косметику, русский мужик не перекрестится" (C) Кто-то
Airhand вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск файлов по маске и нахождения общего размера найденных файлов и вывод в терминал Колямбий Помощь студентам 0 21.04.2013 21:31
C#.LINQ Генерация всех перестановок без рекурсии Lasur Помощь студентам 2 08.04.2012 19:38
Рекурсивный поиск файлов в интервале дат(без времени,только день,месяц и год)) AlexKhol Общие вопросы Delphi 3 04.02.2012 16:15
А нужно без рекурсии Kazik Общие вопросы Delphi 1 22.05.2010 12:20
С помощью рекурсии без операторов цикла и перехода написать процедуру P(N) WhyBeNormal Помощь студентам 1 29.01.2009 01:20