Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

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

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

Купить рекламу на форуме - 42 тыс руб за месяц

Закрытая тема
Ваша тема закрыта, почему это могло произойти? Возможно,
Нет наработок или кода, если нужно готовое решение - создайте тему в разделе Фриланс и оплатите работу.
Название темы включает слова - "Помогите", "Нужна помощь", "Срочно", "Пожалуйста".
Название темы слишком короткое или не отражает сути вашего вопроса.
Тема исчерпала себя, помните, один вопрос - одна тема
Прочитайте правила и заново правильно создайте тему.
 
Опции темы Поиск в этой теме
Старый 01.11.2010, 20:23   #1
zumm
БохЪ
Форумчанин
 
Аватар для zumm
 
Регистрация: 30.09.2009
Сообщений: 724
Вопрос Рекурсивный поиск

Код:
    function recurse(path: string; mask: string): boolean;
    var
      srec: TSearchRec;
      retval: integer;
      oldlen: integer;
    begin
      recurse:=true;
      oldlen:=length(path);
      retval:=findfirst(path+mask,faanyfile,srec);
      while retval=0 do
      begin
        if (srec.attr and favolumeid)=0 then
          ListFile.Add(path+srec.name);
        retval:=findnext(srec);
      end;
      findclose(srec);
      if not result then
        exit;
      retval:=findfirst(path+'*.*',fadirectory,srec);
      while retval=0 do
      begin
        if (srec.attr and fadirectory)<>0 then
          if (srec.name<>'.') and (srec.name<>'..') then
          begin
            path:=path+srec.name+'\';
            if not recurse(path,mask) then
            begin
              result:=false;
              break;
            end;
            delete(path,oldlen+1,255);
          end;
          retval:=findnext(srec);
        end;
        findclose(srec);
      end;
    begin
    if path='' then
      getdir(0,fullpath)
    else
      fullpath:=path;
    if fullpath[length(fullpath)]<>'\' then
      fullpath:=fullpath+'\';
    if mask='' then
      recurse(fullpath,'*.*')
    else
      recurse(fullpath,mask);
  end;
Доброго всем! Накатал я вот такой вот поиск, вроде работает, но вот есть но...я заметил что он не находит некоторые файлы, например wand.dat (не подумайте не чего плохого, я просто взял этот файл для примера ) это файл который использутся оперой и у многих есть, есть он и у меня. Я попробовал найти его стандартным поиском, нашло, а вот моим кодом не находит....может знает кто в чем проблема?
В планах порабощение вселенной...
zumm вне форума
Старый 01.11.2010, 20:33   #2
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Вот так находит нормально:
Код:
procedure ScanDir(StartDir: string; Mask:string; List:TStrings);
var
SearchRec : TSearchRec;
begin
if Mask = '' then Mask := '*.*';
if StartDir[Length(StartDir)] <> '\' then StartDir := StartDir + '\';
if FindFirst(StartDir+Mask, faAnyFile, SearchRec) = 0 then
begin
repeat
Application.ProcessMessages;
if (SearchRec.Attr and faDirectory) <> faDirectory then
List.Add(StartDir + SearchRec.Name)
else if (SearchRec.Name <> '..') and (SearchRec.Name <> '.') then
begin
List.Add(StartDir + SearchRec.Name + '\');
ScanDir(StartDir + SearchRec.Name + '\',Mask,List);
end;
until FindNext(SearchRec) <> 0;
FindClose(SearchRec);
end;
end;

Пример вызова. параметры
1. имя папки
2. маска, по умолчанию *.*
3. хранилище для результата, любой наследник от TString, например TStringList

procedure TForm1.Button1Click(Sender: TObject);
begin
ListBox1.Items.Clear;
ScanDir('c:','',ListBox1.Items);
Label1.Caption := IntToStr(ListBox1.Items.Count);
end;
mihali4 вне форума
Старый 01.11.2010, 20:51   #3
zumm
БохЪ
Форумчанин
 
Аватар для zumm
 
Регистрация: 30.09.2009
Сообщений: 724
По умолчанию

а вы попробуйте

Код:
ScanDir('c:','wand.dat',ListBox1.Items);
Не найдет
В планах порабощение вселенной...
zumm вне форума
Старый 01.11.2010, 21:01   #4
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

А что тут удивительного ?
Вы задали :
- искать файл wand.dat
- искать в корне диска С

Вы задайте
Код:
ScanDir('c:','',ListBox1.Items);
и она найдет...
mihali4 вне форума
Старый 01.11.2010, 21:02   #5
zumm
БохЪ
Форумчанин
 
Аватар для zumm
 
Регистрация: 30.09.2009
Сообщений: 724
По умолчанию

хм....я просто по своей орИЕнтеровался у меня каК бЫ ищет начиная с указанного каталога во всех его подкаталогах....

если уж указать в каком каталоге искать, то и у меня найдет...
В планах порабощение вселенной...

Последний раз редактировалось mihali4; 01.11.2010 в 21:15.
zumm вне форума
Старый 01.11.2010, 21:14   #6
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Ладно, получите другой вариант:
Код:
procedure FindFiles(StartFolder, Mask: String; List: TStrings; 
ScanSubFolders: Boolean = True); 
var 
SearchRec: TSearchRec; 
FindResult: Integer; 
begin 
List.BeginUpdate; 
try 
StartFolder:=IncludeTrailingBackslash(StartFolder); 
FindResult:=FindFirst(StartFolder+'*.*', faAnyFile, SearchRec); 
try 
while FindResult = 0 do with SearchRec do begin 
if (Attr and faDirectory)>0 then begin 
if ScanSubFolders and (Name<>'.') and (Name<>'..') then 
FindFiles(StartFolder+Name, Mask, List, ScanSubFolders); 
end else begin 
if MatchesMask(Name, Mask) then List.Add(StartFolder+Name); 
end; 
FindResult:=FindNext(SearchRec); 
end; 
finally 
FindClose(SearchRec); 
end; 
finally 
List.EndUpdate; 
end; 
end; 

procedure TForm1.Button9Click(Sender: TObject);
begin
ListBox1.Items.Clear;
FindFiles('C:', 'wand.dat', ListBox1.Items, true);
Label1.Caption := IntToStr(ListBox1.Items.Count);
end;
Только не забудьте в uses добавить Masks...
mihali4 вне форума
Старый 01.11.2010, 21:36   #7
zumm
БохЪ
Форумчанин
 
Аватар для zumm
 
Регистрация: 30.09.2009
Сообщений: 724
По умолчанию

Вот! Вот теперь ищет, спасибо
В планах порабощение вселенной...
zumm вне форума
Старый 01.11.2010, 22:47   #8
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,239
По умолчанию

Если нужно, компонент для поиска файлов
Вложения
Тип файла: zip mfilescan.zip (13.1 Кб, 39 просмотров)
Alter вне форума
Закрытая тема


Купить рекламу на форуме - 42 тыс руб за месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
рекурсивный алгоритм. Nelson1992 Помощь студентам 9 21.03.2010 12:09
Рекурсивный алгоритм SVM Общие вопросы C/C++ 7 13.11.2009 09:24
рекурсивный поиск файлов всех картинок doniyor Общие вопросы Delphi 3 08.09.2009 09:21
Рекурсивный поиск папок FindFirst Lehanidze Помощь студентам 4 06.08.2009 13:13
Сортировка, поиск, рекурсивный алгоритм Delphi Stases Помощь студентам 4 29.05.2009 01:15