> Если не трудно на киньте линк(или сам код) рекурсивного > прохода на Си.
Заводим массив структур (или динамический список Л1), в которой одним из свойств будет имя каталога. Заводим два указателя и инициализируем первым элементом массива. Первый указатель двигаем при добавлении найденого каталога, второй для перехода в новый каталог.
Используя функции "файндфёст" и "файнднекст" обходим сначала корневой каталог с поиском в нем каталогов по нужным фильтрам. Таким образом первый указатель по массиву продвинется на количество найденых каталогов первого уровня. Как только "файнднекст"ом дошли до конца, дергаем новый каталог "файндфёстом", взяв его имя по второму указателю. И так до тех пор пока второй указатель не добежит до первого.
А линков на рекурсию я не знаю.
нужен самый быстрый алгоритм прохлда покаталогу, исходные данные это начальный адрес, глубина максимальная. На выходе нужен фаил с полными адремсами ко всем подкаталогам и файлам с данными об их размере и дате последнего изменения. Подскажите плз что и где можно почитать. Не как не могу найти алгоритм.
Заранее спасибо.
Есть такой алгоритм прямо в этом форуме, но к твоему сожалению не на C++18.07.07 13:26 Автор: Den <Денис Т.> Статус: The Elderman
> и мне нужен не просто алгоритм прохода по каталогу, а самая > быстрая реализация этого самого прохода :) Алгоритмов тут всего-то ничего, раз два и обчелся. А по скорости все одинаковы будут и скорость будет определяться не методологией, и не быстродействием процессора-памяти, а накопителем.
Если же использовать метод не рекурсивного обхода, а по уровням, то скорости может добавить, если каталоги уровня сначала упорядочить по их месторасположению на диске. Хотя и это может дать слишком малый прирост скорости, если каталоги форагментированы и фрагменты и так раскиданы по всему диску.
[C++] Кроме рекурсии, больше ни чего нет?!?!?!18.07.07 17:48 Автор: hotice Статус: Незарегистрированный пользователь
> > и мне нужен не просто алгоритм прохода по каталогу, а > самая > > быстрая реализация этого самого прохода :) > Алгоритмов тут всего-то ничего, раз два и обчелся. А по > скорости все одинаковы будут и скорость будет определяться > не методологией, и не быстродействием процессора-памяти, а > накопителем. > Если же использовать метод не рекурсивного обхода, а по > уровням, то скорости может добавить, если каталоги уровня > сначала упорядочить по их месторасположению на диске. Хотя > и это может дать слишком малый прирост скорости, если > каталоги форагментированы и фрагменты и так раскиданы по > всему диску.
При поиске в нете я обнаружил рекурсивную реализацию (правда на delphi), вообщем то других вариантов не описано. Интересное предложение насчёт уровней, но ИХМО делать постоянную дефраминтацию выйдет дороже по времени (всё равно спасибо).
Если не трудно на киньте линк(или сам код) рекурсивного прохода на Си.
есть вот такая реализация:
[code]
void ScanDir(String dir)
{
TSearchRec SearchRec;
FindFirst(dir+"\\*.*", faAnyFile, SearchRec);
do
{
if(SearchRec.Size == 0 && SearchRec.Name.Length()>2 )
//здесь я как понимаю действия если найден каталог
ScanDir(dir+"\\"+SearchRec.Name);
else
{
//а здесь если найден фаил
};
}while (FindNext(SearchRec)==0);
FindClose(SearchRec);
}
[\code]
помогите разобраться:
1. что за структура TSearchReс, как её определить.
2. и переменная типа string, ругается на ошибку.
P.S. Я программирую в среде Visual Studio 2005. Пробую работать с консольным приложением. В будущем перейду на MFC.
Рекурсия - самый простой и эффективный для таких задач метод.18.07.07 18:37 Автор: Den <Денис Т.> Статус: The Elderman
> Если не трудно на киньте линк(или сам код) рекурсивного > прохода на Си.
Заводим массив структур (или динамический список Л1), в которой одним из свойств будет имя каталога. Заводим два указателя и инициализируем первым элементом массива. Первый указатель двигаем при добавлении найденого каталога, второй для перехода в новый каталог.
Используя функции "файндфёст" и "файнднекст" обходим сначала корневой каталог с поиском в нем каталогов по нужным фильтрам. Таким образом первый указатель по массиву продвинется на количество найденых каталогов первого уровня. Как только "файнднекст"ом дошли до конца, дергаем новый каталог "файндфёстом", взяв его имя по второму указателю. И так до тех пор пока второй указатель не добежит до первого.
А линков на рекурсию я не знаю.