пытаюсь сделать функцию рекурсивного поиска с циклом 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'); - и ноль реакции . Вторая часть кода, не знаю что исправить там нужно .
Другие языки программирования и технологии
Рекурсия поиск на Delphi в цикле WHILE - исправьте код ?
Ошибки в логике алгоритма поиска. Вторая часть поиска почти правильная. Первая подкачала.
Первое:
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!
Первое:
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!
Файндоес - что это за переменная она у тебя глобальная? если нет но переменные нужно нарочно значение присваивать с таких мелочей начинаются большие проблемы, напрмер Файндрес: =0; опять же откуда взялась переменная ФайндНекст и определена ли она? Если твой ИФ непрокатывает получается ты НИЛ приравниваешь к НИЛ, ну короче бред полный выходит. А ошибка у тебя вылазиет именно из -за этого потому как в цикле репиат-антил, она по этапом какоето значение сетаки и получала у тебя а с циклом с предусловием ваял ты пытаешься сравнивать пустое значение с чем то а потом этому пустому значению пытаешься присвоить такое же пустое значение.
Похожие вопросы
- Помогите пожалуйста разобраться с циклом while c++
- C#.Цикл while и метод ReadLine()
- Написал небольшую программу, не могу понять почему не работает цикл while и оператор else
- Помогите исправить код чтобы он считал балы теста Pascal
- Помогите с задачкой по с + +(цикл while)
- Паскаль. Цикл While. Определить остаток от деления большего числа а на меньшее число b, не используя стандартные функции
- Помогите исправить код так, чтобы работал! :) (C#)
- Pascal помогите исправить код
- помогите исправить код BV
- Помогите пожалуйста исправить код программы на visual c++!!