![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
|
Доброго времени суток. Прошу извинить если такая тема уже есть на форуме, но в этой теме не нужно рассказывать мне как реализовать поиск файлов, мне хотелось бы узнать что не верно в коде поиска!
Код:
procedure TForm1.FindFile(Dir: String);
Var SR:TSearchRec;
FindRes:Integer;
begin
FindRes:=FindFirst(Dir+'*.*',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;
if ((SR.Attr and faDirectory)=faDirectory) then // если найден каталог, то
begin
FindFile(Dir+SR.Name+''); // входим в процедуру поиска с параметрами текущего каталога + каталог, что мы нашли
FindRes:=FindNext(SR); // после осмотра вложенного каталога мы продолжаем поиск в этом каталоге
Continue; // продолжить цикл
end;
FindRes:=FindNext(SR);
ListBox1.Items.Add(SR.Name);
end;
FindClose(SR);
end;Работаю в Delphi 7! |
|
#2
|
||||
|
||||
|
Код:
FindFirst(Dir+'*.*',faAnyFile,SR); |
|
#3
|
||||
|
||||
|
Цитата:
допустим Dir:='d:\'; -> следовательно нужно найти все файлы на диске D |
|
#4
|
||||
|
||||
|
Можно через рекурсию.
|
|
#5
|
||||
|
||||
|
У тебя маска: *.*, то есть <куча букв><точка><куча букв>. К папкам она тоже относится.
И, кстати: Код:
FindFile(Dir+SR.Name+''); // входим в процедуру поиска с параметрами текущего каталога + каталог, что мы нашли Последний раз редактировалось Bargest, 21.11.2012 в 21:01. |
|
#6
|
||||
|
||||
|
Цитата:
Цитата:
|
|
#7
|
||||
|
||||
|
Повторяю в третий раз. Маска выглядит как <куча букв><точка><куча букв>. Функция ничего о расширениях не знает. Она просто ищет файл по такой маске, то есть в названии которого есть точка. Если точки нет, то файл (или папка) под маску не подходит и отбрасывается.
Если нужно перебирать все файлы и папки, то маска должна быть просто * |
|
#8
|
||||
|
||||
|
Цитата:
![]() |
|
#9
|
||||
|
||||
|
Цитата:
Ошибка у тебя здесь: Код:
FindFile(Dir+SR.Name+''); // входим в процедуру поиска с параметрами текущего каталога + каталог, что мы нашли |
|
#10
|
||||
|
||||
|
Цитата:
MoS, рекурсия коварна! Может стек переполниться. (это так, к сведению) |
|
#11
|
||||
|
||||
|
Цитата:
Цитата:
|
|
#12
|
||||
|
||||
|
Раз никак не дойдет что тебе толкуют, вот тебе солюшен
Код:
procedure TForm1.FindFile(Dir: String);
Var SR:TSearchRec;
FindRes:Integer;
begin
FindRes:=FindFirst(Dir+'*.*',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;
if ((SR.Attr and faDirectory)=faDirectory) then // если найден каталог, то
begin
FindFile(Dir+SR.Name+'\*.*'); // входим в процедуру поиска с параметрами текущего каталога + каталог, что мы нашли
FindRes:=FindNext(SR); // после осмотра вложенного каталога мы продолжаем поиск в этом каталоге
Continue; // продолжить цикл
end;
FindRes:=FindNext(SR);
ListBox1.Items.Add(SR.Name);
end;
FindClose(SR);
end; |
|
#13
|
||||
|
||||
|
Цитата:
Там у тебя добавляется пустая строка, а должен добавляться символ '\'. |
|
#14
|
||||
|
||||
|
Только не '\*.*', а просто '\', а то его функция добавит еще одну *.*, и получится \*.**.*
Я кстати уже писал, ток ТС заигнорил.Цитата:
Последний раз редактировалось Bargest, 21.11.2012 в 22:04. |
|
#15
|
||||
|
||||
|
Цитата:
Цитата:
![]() Последний раз редактировалось MoS, 21.11.2012 в 22:16. |