Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Файловая система
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 21.11.2012, 20:41
Аватар для MoS
MoS MoS вне форума
Прохожий
 
Регистрация: 21.11.2012
Сообщения: 29
Версия Delphi: 7
Репутация: 10
По умолчанию Поиск файлов: FindFirst и FindNext

Доброго времени суток. Прошу извинить если такая тема уже есть на форуме, но в этой теме не нужно рассказывать мне как реализовать поиск файлов, мне хотелось бы узнать что не верно в коде поиска!
Код:
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;
Почему-то результат поиска не предсказуем, все файлы которые находятся в папке Dir находит, а вот в подпапки папки Dir поиск не ведется, в чем может быть причина?
Работаю в Delphi 7!
Ответить с цитированием
  #2  
Старый 21.11.2012, 20:43
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Код:
FindFirst(Dir+'*.*',faAnyFile,SR); 
А папки-то у тебя под эту маску попадают?
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #3  
Старый 21.11.2012, 20:46
Аватар для MoS
MoS MoS вне форума
Прохожий
 
Регистрация: 21.11.2012
Сообщения: 29
Версия Delphi: 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Bargest
Код:
FindFirst(Dir+'*.*',faAnyFile,SR); 
А папки-то у тебя под эту маску попадают?
Папка = Dir.
допустим Dir:='d:\'; -> следовательно нужно найти все файлы на диске D
Ответить с цитированием
  #4  
Старый 21.11.2012, 20:55
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Можно через рекурсию.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #5  
Старый 21.11.2012, 20:57
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

У тебя маска: *.*, то есть <куча букв><точка><куча букв>. К папкам она тоже относится.
И, кстати:
Код:
FindFile(Dir+SR.Name+''); // входим в процедуру поиска с параметрами текущего каталога + каталог, что мы нашли
Было бы неплохо на конце слеш поставить.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 21.11.2012 в 21:01.
Ответить с цитированием
  #6  
Старый 21.11.2012, 20:58
Аватар для MoS
MoS MoS вне форума
Прохожий
 
Регистрация: 21.11.2012
Сообщения: 29
Версия Delphi: 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от M.A.D.M.A.N.
Можно через рекурсию.
А это как, можно пример, если не сложно!

Цитата:
Сообщение от Bargest
У тебя маска: *.*, то есть <куча букв><точка><куча букв>
Так это маска для того чтобы искало все файлы, а не только с каким-либо расширением! Или может это не правильная маска?
Ответить с цитированием
  #7  
Старый 21.11.2012, 21:02
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Повторяю в третий раз. Маска выглядит как <куча букв><точка><куча букв>. Функция ничего о расширениях не знает. Она просто ищет файл по такой маске, то есть в названии которого есть точка. Если точки нет, то файл (или папка) под маску не подходит и отбрасывается.
Если нужно перебирать все файлы и папки, то маска должна быть просто *
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #8  
Старый 21.11.2012, 21:04
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Цитата:
Сообщение от M.A.D.M.A.N.
Можно через рекурсию.
Мэд, оно и так через рекурсию.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием
  #9  
Старый 21.11.2012, 21:05
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от MoS
Почему-то результат поиска не предсказуем, все файлы которые находятся в папке Dir находит, а вот в подпапки папки Dir поиск не ведется, в чем может быть причина?
Работаю в Delphi 7!
Есть в Delphi такая замечательная штука как отладчик. Если бы ты им пользовался, то быстро нашёл ошибку.
Ошибка у тебя здесь:
Код:
FindFile(Dir+SR.Name+''); // входим в процедуру поиска с параметрами текущего каталога + каталог, что мы нашли
Ответить с цитированием
  #10  
Старый 21.11.2012, 21:41
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Цитата:
Сообщение от Bargest
Мэд, оно и так через рекурсию.
Сорри, толком не читал каракульки ТС, уж больно нечитабельно.

MoS, рекурсия коварна! Может стек переполниться. (это так, к сведению)
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #11  
Старый 21.11.2012, 21:51
Аватар для MoS
MoS MoS вне форума
Прохожий
 
Регистрация: 21.11.2012
Сообщения: 29
Версия Delphi: 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от Bargest
Повторяю в третий раз. Маска выглядит как <куча букв><точка><куча букв>. Функция ничего о расширениях не знает. Она просто ищет файл по такой маске, то есть в названии которого есть точка. Если точки нет, то файл (или папка) под маску не подходит и отбрасывается.
Если нужно перебирать все файлы и папки, то маска должна быть просто *
Дело вовсе не в маске, файлы и так ищет! Проблема в том, что не ищет файлы в подпапках папки, хотя условие для этого поиска написано!

Цитата:
Сообщение от poli-smen
Есть в Delphi такая замечательная штука как отладчик. Если бы ты им пользовался, то быстро нашёл ошибку.
Ошибка у тебя здесь:
Код:
FindFile(Dir+SR.Name+''); // входим в процедуру поиска с параметрами текущего каталога + каталог, что мы нашли
Ну тогда если не трудно, напиши как правильно быть должно!
Ответить с цитированием
  #12  
Старый 21.11.2012, 21:54
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Раз никак не дойдет что тебе толкуют, вот тебе солюшен
Код:
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, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #13  
Старый 21.11.2012, 21:56
Аватар для poli-smen
poli-smen poli-smen вне форума
Профессионал
 
Регистрация: 06.08.2012
Адрес: Кривой Рог
Сообщения: 1,791
Версия Delphi: Delphi 7, XE2
Репутация: 4415
По умолчанию

Цитата:
Сообщение от MoS
Ну тогда если не трудно, напиши как правильно быть должно!
Всё же отладчиком не хочешь пользоваться?
Там у тебя добавляется пустая строка, а должен добавляться символ '\'.
Ответить с цитированием
  #14  
Старый 21.11.2012, 22:01
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Только не '\*.*', а просто '\', а то его функция добавит еще одну *.*, и получится \*.**.* Я кстати уже писал, ток ТС заигнорил.
Цитата:
Дело вовсе не в маске, файлы и так ищет!
Ясен красен, в имени 99% файлов есть точка, потому что у них есть расширение. Может, конечно, и есть какой-то костыль в винде на счет маски *.* (и кто ее вообще придумал?), но сомневаюсь.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.

Последний раз редактировалось Bargest, 21.11.2012 в 22:04.
Ответить с цитированием
  #15  
Старый 21.11.2012, 22:12
Аватар для MoS
MoS MoS вне форума
Прохожий
 
Регистрация: 21.11.2012
Сообщения: 29
Версия Delphi: 7
Репутация: 10
По умолчанию

Цитата:
Сообщение от M.A.D.M.A.N.
Раз никак не дойдет что тебе толкуют, вот тебе солюшен
Код:
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;
Спасибо, правда почему-то теперь одну папку занесло в листбокс!

Цитата:
Сообщение от Bargest
Я кстати уже писал, ток ТС заигнорил.
Да, точно, не увидел в низу!

Последний раз редактировалось MoS, 21.11.2012 в 22:16.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 11:24.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter