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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 25.08.2015, 19:11   #1
aesoem
Форумчанин
 
Регистрация: 24.12.2007
Сообщений: 288
По умолчанию Поиск файлов в Delphi по маске

Ситуация такая, код поиска всех файлов на ПК, он же теоретически и код поиска по маске....

Код:
procedure FindFile(Dir: String);
Var SR:TSearchRec;
    FindRes:Integer;
begin
form1.sstatusbar1.Panels[0].Text:='Поиск: '+Dir+SR.Name ;


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);

with form1.sListView1.Items.Add do
begin
  caption:=sr.Name;
  subitems.Add(Dir+SR.Name);
end;

end;
FindClose(SR);
end;
Все работает хорошо, но если изменить маску поиска например на *.txt
и начальном каталоге поиска (пусть C:\) не будет хотя бы одного файла попадающего в критерии поиска то поиск прекращается в этой директории. Причем все примеры и исходники в сети работают так же...

Помогите исправить этот код, чтобы он начал искать в других папках если в первой нечего не найдено
aesoem вне форума Ответить с цитированием
Старый 25.08.2015, 19:21   #2
BARNEY
Участник клуба
 
Регистрация: 23.04.2009
Сообщений: 1,058
По умолчанию

может в поиске глянуть? )

Код:
procedure DirSearch(Dir: string; Mask : string; SL: TStrings);
var
   SearchRec: TSearchRec;
begin
   Dir := IncludeTrailingBackslash(Dir);
   if FindFirst(Dir + ‘*.*’, faAnyFile, SearchRec) = 0 then
     repeat
       Application.ProcessMessages;

       if (SearchRec.Attr and faDirectory) 0 then begin
         if (SearchRec.name ‘.’) and (SearchRec.name ‘..’) then
                 DirSearch(Dir + SearchRec.name, Mask, sl)
       end
       else
         if MatchesMask(ExtractFileName(SearchRec.Name), Mask) then
           Sl.Add(Dir + SearchRec.Name);
     until FindNext(SearchRec) 0;
   FindClose(SearchRec);
end;

// ИСПОЛЬЗОВАТЬ ТАК:
procedure TForm1.Button1Click(Sender: TObject);
begin
   DirSearch(’C:\TEMP’, ‘*.AVI’, Memo1.Lines);
end;
Если вам человек помог, не стесняйтесь говорить спасибо (весы под аватаром)
BARNEY вне форума Ответить с цитированием
Старый 25.08.2015, 19:25   #3
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Файлы искать по заданной маске, каталоги по маске *.*
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 25.08.2015, 19:40   #4
aesoem
Форумчанин
 
Регистрация: 24.12.2007
Сообщений: 288
По умолчанию

я находил этот код...
символы нужные в коде раставил\заменил но таким строкам как
Код:
 if MatchesMask(ExtractFileName(SearchRec.Name), Mask) then
ума дать не могу... как это понять и что это вообще MatchesMask

аватар, это я понял, да вот не находит от по маске)
FindFirst разве не возвращает 0 когда на каталог натыкается?
Или каталог он не может найти из-за маски поиска

Последний раз редактировалось Stilet; 25.08.2015 в 20:00.
aesoem вне форума Ответить с цитированием
Старый 25.08.2015, 19:59   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Код:
uses Masks;

procedure DirSearch(Dir: string; Mask : string; SL: TStrings);
var
   SearchRec: TSearchRec;
begin
   Dir := IncludeTrailingBackslash(Dir);
   if FindFirst(Dir + '*.*', faAnyFile, SearchRec) = 0 then
     repeat
       Application.ProcessMessages;

       if (SearchRec.Attr and faDirectory)<>0 then begin
         if (SearchRec.name<>'.') and (SearchRec.name<>'..') then
                 DirSearch(Dir + SearchRec.name, Mask, sl)
       end
       else
         if MatchesMask(ExtractFileName(SearchRec.Name), Mask) then
           Sl.Add(Dir + SearchRec.Name);
     until FindNext(SearchRec)<>0;
   FindClose(SearchRec);
end;
В примере код искорежен
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 25.08.2015, 20:44   #6
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,761
По умолчанию

Если версия Delphi не древняя, то лучше использовать TDirectory.GetFiles
FaTaL вне форума Ответить с цитированием
Старый 26.08.2015, 13:01   #7
SLAUR
Пользователь
 
Регистрация: 16.10.2014
Сообщений: 51
По умолчанию

пользуюсь этой процедурой,прекрасно работает

Код:
procedure SearchInDir(Mask, Dir: string; Subdir: Boolean; var List: tStringList);
var
  r: integer;
  f: TSearchRec;
begin
  if Dir = '' then Exit;
  if Dir[Length(Dir)] <> '\' then Dir := Dir + '\';
{$I-}
  ChDir(Dir);
{$I+}
  if IOResult <> 0 then Exit;
  r := FindFirst('*.*', faAnyFile, f);
  while r = 0 do
  begin
    IF ((f.Attr and faDirectory) <> faDirectory) THEN
    if (MatchesMask(f.Name, Mask))or(mask='*.*') then
      if (f.Name <> '.') and (f.Name <> '..') then
        List.Add(ExpandFileName(f.Name));
    if (f.Attr and faDirectory) = faDirectory then
      if SubDir = True then
      begin
        if (f.Name <> '.') and (f.Name <> '..') then
        begin
          SearchInDir(Mask, ExpandFileName(f.Name), SubDir, List);
          ChDir(Dir);
        end;
      end;
    r := FindNext(f);
  end;
  FindClose(f);
end;
Например SearchInDir('*.mp3','C:\' ,True , List1)
(параметр SubDir-искать ли в подкаталогах)
ps не забудьте создать перед использованием процедуры List1:=tStringList.Create;

Последний раз редактировалось SLAUR; 26.08.2015 в 13:10.
SLAUR вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поиск файлов по маске kholoshchak Общие вопросы Delphi 7 31.10.2013 16:46
Поиск файлов по маске и нахождения общего размера найденных файлов и вывод в терминал Колямбий Помощь студентам 0 21.04.2013 21:31
Случайный поиск файлов по маске Armatus Общие вопросы C/C++ 8 13.04.2011 16:51
Поиск файлов по маске на FTP Stilet Win Api 2 13.04.2011 12:03