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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.06.2009, 20:14   #1
andreww
Пользователь
 
Регистрация: 26.05.2009
Сообщений: 20
По умолчанию Может у кого нибудь есть программа поиска файла по шаблону?бросьте пжл

Код:
program vm6;
{$M 4096}
uses
sysutils;

procedure find(cat: string);
var
 inf: TSearchRec;  {возвр инф о след файле удов усл поиска}
begin
 if FindFirst(IncludeTrailingPathDelimiter(cat)+'*', not faDirectory, inf)<>0 then
  writeln(IncludeTrailingPathDelimiter(cat));
 FindClose(inf);

 if FindFirst(IncludeTrailingPathDelimiter(cat)+'*', faDirectory, inf)=0 then
  begin
   if inf.name='.' then FindNext(inf); if inf.name='..' then FindNext(inf);
   if inf.name='.' then FindNext(inf);

   if (inf.attr=16) and (inf.name<>'.') and (inf.name<>'..') then
   find(IncludeTrailingPathDelimiter(cat)+inf.name);
   while FindNext(inf)=0 do
    begin
     if (inf.attr=16) and (inf.name<>'.') and (inf.name<>'..') then
     find(IncludeTrailingPathDelimiter(cat)+inf.name);   { ищет \}
    end;
  end;
 FindClose(inf); {закрывает поиск и освобож опер память}
end;

begin
 if paramstr(1)='/?' then {если считывает /? то выдает инфор}
  begin
   writeln;
   writeln('Программа осуществляет поиск пустых каталогов.');
   writeln;
   writeln('Введите после пробела местоположение каталога, в котором необходимо');
   writeln('осуществить поиск. Если требуется поиск в корневом каталоге, введите /r');
   exit;
  end;
 if paramstr(1)='' then {если ниче не набр}
  begin
   writeln('Не указано место поиска');
   exit;
  end;
 if (paramstr(1)[length(paramstr(1))]<>'\') and (paramstr(1)<>'/r') then  { если путь введен неверно}
  begin
   writeln('Имя каталога задано неверно');
   exit;
  end;
 if not DirectoryExists(paramstr(1)) and (paramstr(1)<>'/r') then {если не найден каталог }
  begin
   writeln('Данного каталога не существует');
   exit;
  end;
 if paramstr(1)='/r' then {если введен ключ}
  begin
   find(copy(paramstr(0),0,3));
   writeln('Работа программы окончена ');
   exit;
  end;
 find(ExtractFilePath(paramstr(1)));{извлечение части полного имени файла}
 writeln('Работа программы окончена ');
 readln;
end.
и не могли бы объяснить как работает в этой программе функция sort

Заранее благодарен
andreww вне форума Ответить с цитированием
Старый 03.06.2009, 00:23   #2
Dj_smart
Капсула от спама
Форумчанин
 
Аватар для Dj_smart
 
Регистрация: 04.03.2008
Сообщений: 779
По умолчанию

Ну дык замените '*' на нужный вам шаблон и вуаля!
Например '*.rar'
Если данный ответ не столь конкретен, как Вы желаете его увидеть, возможно необходимо поразмыслить, стоит ли вопрос того, чтобы о нём спрашивать на форуме?
CncFiles.ru - бесплатный файловый хостинг
Dj_smart вне форума Ответить с цитированием
Старый 03.06.2009, 06:56   #3
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Ну дык замените '*' на нужный вам шаблон и вуаля!
нет, так не получится. Если Вы внимательно посмотрите на функцию FIND() то увидите, что она вызывает сама себя рекурсивно (для поиска по подкаталогам).
Если сделать предложенную Вами доработку, то она будет заходить только в каталоги, которые соответствуют шаблону (в Вашем случае с *.rar, если каталог будет называться, например, ПАПКА.RAR)

andreww, на мой взгляд, у Вас два альтернативных пути решения - либо искать папки отдельным циклом, а файлы в папках по шаблону (я бы предложил именно такой вариант)

либо задействовать использование регулярных выражений и все найденные имена проверять на шаблон через регулярные выражения.
Serge_Bliznykov вне форума Ответить с цитированием
Старый 03.06.2009, 08:19   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А что за проблема пройтись поиском по форуму и поднять простейший пример по рекурсии?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.06.2009, 08:40   #5
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,761
По умолчанию

Вот пример и всё нормально работает и по маске:
Код:
procedure TForm1.FindFile(Dir: string);
var
  SR: TSearchRec;
  FindRes: Integer;
  Kol:integer;
begin
  FindRes := FindFirst(Dir + '*.rar', 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;

    ListBox1.Items.Add(SR.Name);
    FindRes := FindNext(SR);
  end;
  FindClose(SR);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
listbox1.Clear;
FindFile(edit1.Text);
end;
FaTaL вне форума Ответить с цитированием
Старый 03.06.2009, 10:15   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

FaTaL, Вы, наверное, моё сообщение выше не читали... ;( Вы сами свой код проверяли?

в папке на которую ссылается edit1.Text создайте подпапку КУКУ, в ней положите файлик TEST.RAR
и проверьте, найдётся он!!
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ребят может у кого-нибудь есть исходники для программы поиска файлов соответствующих шаблону? andreww Паскаль, Turbo Pascal, PascalABC.NET 0 31.05.2009 10:18
У кого нибудь есть исходный код функции Copy slips Паскаль, Turbo Pascal, PascalABC.NET 3 25.04.2009 13:13
У кого-нибудь есть исходники для игры Жизнь? Maxpm Gamedev - cоздание игр: Unity, OpenGL, DirectX 3 01.03.2007 13:52
Есть у кого нибудь русский help для Delphi 7.0??? Kren Общие вопросы Delphi 7 12.01.2007 22:06