Другие языки программирования и технологии

Рекурсия поиск на Delphi в цикле WHILE - исправьте код ?

пытаюсь сделать функцию рекурсивного поиска с циклом WHILE . С циклом REPEAT - UNTIL разобрался, всё работает . Но хотелось бы для закрепления разных способов сделать это и с WHILE .
вот код .

procedure TForm1.FindFile(Dir:String; fileN:string);

Var SR:TSearchRec;

FindRes:Integer;

begin

FindRes:=FindFirst(Dir+ fileN,faAnyFile,SR);

While FindRes=0 do

begin

if ((SR.Attr and faDirectory)=faDirectory) and

((SR.Name='.')or(SR.Name='..')) then

begin

FindRes:=FindNext(SR);

continue;

end;

findclose(SR);

FindRes:=FindFirst(Dir+'*',faanyfile,SR);

while FindRes=0 do

begin

if ((SR.Attr and faDirectory)=faDirectory) then

if (SR.name<>'..') and (SR.name<>'.') then

FindFile(Dir+ SR.Name+'\', fileN);

listbox1.Items.add(Dir+ SR.Name);

FindRes:=FindNext(SR);

continue;

end;

FindRes:=FindNext(SR);

findclose(SR);

end;

end;

использую так

FindFile('D:\','text.txt'); - и ноль реакции . Вторая часть кода, не знаю что исправить там нужно .
Ошибки в логике алгоритма поиска. Вторая часть поиска почти правильная. Первая подкачала.

Первое:
if ((SR.Attr and faDirectory)=faDirectory) and ((SR.Name='.')or(SR.Name='..')) then
begin
FindRes:=FindNext(SR);
continue;
end;
findclose(sr);

Если найденый результат text.txt - директория и его имя не '.' или '..' то ищем следующий результат. Зачем проверять равно ли имя 'text.txt' точке или двум точкам. FindFirst уже нашла text.txt. После этого сразу следует FindClose. Получается, если найден файл text.txt, то сразу закрываем текущий поиск и открываем новый, ничего не делая. А как же добавить файл в lb? Не логично. Добавление в listbox нужно перенести сюда.

Второе:
У вас получается, что второй цикл While вложен в первый. Не уверен, что так задумывалось.
Расставьте правильно begin-end.

Третье:
Избегайте использования оператора continue в циклах. Лучше перестройте логику цикла, чтобы обходилось без него. Continue очень сильно затрудняет понимание работы кода, особенно в больших циклах. И сами запутаетесь и другие тоже не с первого раза поймут.

Пробуйте. Я сократил ваш код процедуры до 25 строк (включая три пустых строки) . И он 100% работает.

Nikolay Kondaurov, ваша упоротость не знает границ. Быстро, решительно читать справочник по функциям и процедурам Delphi!
ES
Eugene Smith
1 648
Лучший ответ
Файндоес - что это за переменная она у тебя глобальная? если нет но переменные нужно нарочно значение присваивать с таких мелочей начинаются большие проблемы, напрмер Файндрес: =0; опять же откуда взялась переменная ФайндНекст и определена ли она? Если твой ИФ непрокатывает получается ты НИЛ приравниваешь к НИЛ, ну короче бред полный выходит. А ошибка у тебя вылазиет именно из -за этого потому как в цикле репиат-антил, она по этапом какоето значение сетаки и получала у тебя а с циклом с предусловием ваял ты пытаешься сравнивать пустое значение с чем то а потом этому пустому значению пытаешься присвоить такое же пустое значение.