Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Delphi > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Ответ
 
Опции темы
Старый 29.08.2009, 15:48   #1
AIst
Пользователь
 
Аватар для AIst
 
Регистрация: 30.06.2008
Сообщений: 58
Печаль поиск через рекурсию

Код:
function  TForm1.find(dir_name:string) : boolean;
var maska : string;
    SearchRec : TSearchRec;
begin
maska := '*.txt';
SetCurrentDir(dir_name);  // perehodim na naidennii disk
if FindFirst(maska, faAnyFile,SearchRec) = 0 then
       repeat
          if (SearchRec.Attr and faAnyFile) = SearchRec.Attr then
             begin
              memo1.lines.add(dir_name + SearchRec.Name);
             end;
        until FindNext(SearchRec) <> 0;
end;

в качестве исходного каталога - передаю в функцию имя диска, предварительно ищу все жесткие диски в системе(с этим разобрался).

смотрел много примеров как искать далее во всех подкаталогах, но так и не понял...

мне нужно в итоге получить(немного изменить мой исходник) поиск файла во всех подкаталогах через рекурсию.

Поможете доделать?
AIst вне форума Ответить с цитированием
Старый 29.08.2009, 16:07   #2
russian-stalker
Участник клубаДжуниор
 
Аватар для russian-stalker
 
Регистрация: 23.08.2008
Сообщений: 1,616
По умолчанию

Код:
function SearchInFolder(folder, mask: String; flags: DWORD;names: TStrings; addpath: Boolean = False): Boolean;
var
  hSearch: THandle;
  FindData: WIN32_FIND_DATA;
  strSearchPath: String;
  bRes: Boolean; //Если равен True, то нашли хотя бы один файл или каталог
begin
  strSearchPath := folder + '\' + mask;
  bRes := False;
  //Начинаем поиск
  hSearch := FindFirstFile(PAnsiChar(strSearchPath), FindData);
  if (hSearch <> INVALID_HANDLE_VALUE) then
  begin
    //Ищем все похожие элементы (информация о первом элементе уже
    //записана в FindData функцией FindFirstFile)
    repeat
      if (String(FindData.cFileName) <> '..') and
         (String(FindData.cFileName) <> '.') then //Пропускаем . и ..
      begin
        if MatchAttrs(flags, FindData.dwFileAttributes) then
        begin
          //Нашли подходящий объект
          if addpath then
            names.Add(folder + '\' + FindData.cFileName)
          else
            names.Add(FindData.cFileName);
          bRes := True;
        end;
      end;
    until FindNextFile(hSearch, FindData) = FALSE;
    //Заканчиваем поиск
    FindClose(hSearch);
  end;
  files_SearchInFolder := bRes;
end;
Подходит?
russian-stalker вне форума Ответить с цитированием
Старый 29.08.2009, 16:12   #3
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,003
По умолчанию

тут много примеров на форуме...поиск в зубы.

http://programmersforum.ru/showthrea...E0%E9%EB%EE%E2 например

вот в заметках нашел...
Код:
procedure TMainF.FindFiles(APath: String); 
{***} 
var 
FSearchRec, 
DSearchRec: TSearchRec; 
FindResult: integer; 
fst1, fst2: AnsiString; 
D_Nwas: boolean; 
fsz: int64; 

function IsDirNotation(ADirName: String): Boolean; 
begin 
Result := (ADirName = '.') or (ADirName = '..'); 
end; 

begin 
APath := GetDirectoryName(APath); // Obtain a valid directory name 
FindResult := FindFirst(APath+FFileName, 
faAnyFile+faHidden+faSysFile+faRead Only+faArchive, FSearchRec); 
D_Nwas:= true; 

try 
{ Continue to search for the files according to the specified 
mask. If found, add the files and their paths to the listbox.} 
Current.Caption:= aPath; 

while FindResult = 0 do 
begin 
if D_Nwas then 
begin 
lbFiles.Items.Add(aPath); 
D_Nwas:= false; 
end; 
fst:= LowerCase(FSearchRec.Name); 

if sz_on then 
begin 
fsz:= FSearchRec.Size; 
sum:= sum + fsz; 
CurrLine.Caption:= IntToStr(sum); 
end; 
if dt_on then 
Fst2:= DateToStr(FileDateToDateTime(FSearc hRec.Time)); 

if sz_on then 
begin 
if dt_on 
then lbFiles.Items.Add( Format( '%s'#9'%s'#9'%10.2f'#9'%s', [fchr, fst2, fsz/1024, fst]) ) 
else lbFiles.Items.Add( Format( '%s'#9'%10.2f'#9'%s', [fchr, fsz/1024, fst]) ) 
end 
else lbFiles.Items.Add( Format( '%s'#9'%s', [fchr, fst]) ); 
fst:= LowerCase(aPath)+fst; 

FindResult := FindNext(FSearchRec); 
inc(num); 
Number.Caption:= intToStr(num); 
if random(10)<4 then Application.ProcessMessages; 
if stop then 
begin 
FindClose(FSearchRec); 
exit; 
end; 
end; 

{ Now search the sub-directories of this current directory. Do this 
by using FindFirst to loop through each subdirectory, then call 
FindFiles (this function) again. This recursive process will 
continue until all sub-directories have been searched. } 

FindResult := FindFirst(APath+'*.*', faDirectory, DSearchRec); 

while FindResult = 0 do 
begin 
if ((DSearchRec.Attr and faDirectory) = faDirectory) and not 
IsDirNotation(DSearchRec.Name) then 

FindFiles(APath+DSearchRec.Name); // Recursion here 

FindResult := FindNext(DSearchRec); 
if random(10)<5 then Application.ProcessMessages; 
if stop then 
begin 
FindClose(FSearchRec); 
exit; 
end; 
end; 
finally 
FindClose(FSearchRec); 
end; 
end;
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Ответ
Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
поиск через VBA Tirendus Microsoft Office Excel 8 31.07.2009 13:49
Поиск в 2-ух таблицах через запрос icome Microsoft Office Access 3 26.08.2008 18:14
Поиск через DBComboBox Таня84 БД в Delphi 1 01.03.2007 11:46
Поиск через запрос Таня84 БД в Delphi 1 17.02.2007 03:52