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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.06.2009, 19:34   #1
Mixasik
New Delphi Coder
Форумчанин Подтвердите свой е-майл
 
Аватар для Mixasik
 
Регистрация: 20.07.2008
Сообщений: 874
Печаль Поиск первого файла с заданным расширением

Код:
procedure FindFiles(Dir: string; Ext : string; Var SFile : string);
var
  SearchRec: TSearchRec;
begin
  Dir := IncludeTrailingBackslash(Dir);
  if FindFirst(Dir + '*.*', faAnyFile, SearchRec) = 0 then
    repeat
      if (SearchRec.Name = '.') or (SearchRec.Name = '..') then
        Continue;
      if (SearchRec.Attr and faDirectory) <> 0 then
        FindFiles(Dir + SearchRec.Name, Ext, SFile)
      else
        if ExtractFileExt(Dir + SearchRec.Name) = Ext then
          begin SFile := Dir + SearchRec.Name; exit end;//Если расширение совпало выход из процедуры
    until
      FindNext(SearchRec) <> 0;
  FindClose(SearchRec);
end;
Помогите, я модифицировал стандлратный алгоритм, но просто зависает и все((( Мне нужно найти файл с заданным расширением на компьютере, как только он найден прекращаем поиск.
Страх это слабость и потому, кто испугался уже побежден.
Mixasik вне форума Ответить с цитированием
Старый 06.06.2009, 20:16   #2
Daramant
Форумчанин
 
Регистрация: 06.01.2009
Сообщений: 340
По умолчанию

Вот так:
Код:
function FindFiles(Dir: string; Ext : string; Var SFile : string): Boolean;
var
  SearchRec: TSearchRec;
begin
  Dir := IncludeTrailingBackslash(Dir);
  Result := False;

  if FindFirst(Dir + '*', faAnyFile, SearchRec) = 0 then
    repeat
      if (SearchRec.Name = '.') or (SearchRec.Name = '..') then
        Continue;
      if (SearchRec.Attr and faDirectory) <> 0 then
        Result := FindFiles(Dir + SearchRec.Name, Ext, SFile)
      else
        if ExtractFileExt(Dir + LowerCase(SearchRec.Name)) = Ext then begin
          SFile := Dir + SearchRec.Name;
          Result := True;
          Exit;
        end;
    until (FindNext(SearchRec) <> 0) and (Result = False);
  FindClose(SearchRec);
end;
У тебя после exit продолжался поиск в других поддиректориях.
Что бы выполнить сквозной выход из рекурсивной функции я
в условии выхода из цикла добавил еще один параметр Result.

Здесь, возможно, лучше добавить функцию LowerCase чтобы
сравнивать строки в нижнем регистре.
if ExtractFileExt(Dir + LowerCase(SearchRec.Name)) = Ext then begin
Ext я думаю и так в нижнет регистре.
Истинный успех – это то, что Вы сделали в сравнении с тем, что могли бы сделать.
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили "Титаник".
Daramant вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как из полного пути к файлу получить имя файла с расширением uraura Компоненты Delphi 2 20.03.2009 15:53
Автоматический поиск ячейки по заданным параметрам Renzo Microsoft Office Excel 5 07.03.2009 17:48
Поиск файла БД D-mon БД в Delphi 12 29.05.2008 13:26
Как получить график из файла с расширением .crd feldmaster Помощь студентам 1 22.04.2008 23:19
Генерация файла с расширением CPP Solan Общие вопросы C/C++ 8 28.09.2007 10:01