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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.09.2010, 11:59   #1
hrusha2006
 
Регистрация: 13.09.2010
Сообщений: 7
Вопрос Задача по организации поиска фалов

превед,уважаемые форумчане. прошу Вас помоч мне по поводу лабораторной работы по организации поиска файлов средствами Делфи, задача заключается в следующем: Организовать поиск в указанной деректории файлов, в названии которых без расширения на четных позициях стоят буквы b (например abab.txt, ubobab.doc).

сделал следующий набросок:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    Button1: TButton;
    Button2: TButton;
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  SR: TSearchRec;
  FindRes: Integer;
implementation

{$R *.dfm}

procedure TForm1.Button2Click(Sender: TObject);
begin
 close;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ListBox1.Clear;
 FindRes:=FindFirst('C:\Users\õðóíäåëü\Desktop\lab2\*.*',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;
         ListBox1.Items.Add(SR.Name);
      FindRes:=FindNext(SR);
   end;
FindClose(SR);
end;

end.
вся сложность заключается в том,чтобы дать условия ограничения поиска, в нашем случае каждая четная буква в имени файла должна быть буквой b, нужно лиуказывать эти параметры в строке
FindRes:=FindFirst('C:\Users\õðóíäå ëü\Desktop\lab2\*.*',faAnyFile, SR);
или следует использовать какой то другой метод.


буду очень благодарен.

Последний раз редактировалось Stilet; 29.09.2010 в 12:51.
hrusha2006 вне форума Ответить с цитированием
Старый 29.09.2010, 12:33   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,830
По умолчанию

Вместо *.* задайте правильный шаблон.
p51x вне форума Ответить с цитированием
Старый 29.09.2010, 12:57   #3
hrusha2006
 
Регистрация: 13.09.2010
Сообщений: 7
По умолчанию

в этом и вся соль, думаю как и где задать параметры, если задавать тупо вместо *.*, то какой маской нужно пользоватсяю Если например мы будем использовать маску типа ?b?b?b или *b*b?b, то ведь имя файла может содержать и более максимально значение символов в имени,оно канечно ограничивается 256 символами, но писать все 256 символов,учитывая каждую четную b будет не очень хорошим тоном программирования, или ограничения следует задать с этом куске:
if ((SR.Attr and faDirectory)=faDirectory) and
((SR.Name='.')or(SR.Name='..')) then
hrusha2006 вне форума Ответить с цитированием
Старый 29.09.2010, 13:13   #4
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Цитата:
Сообщение от p51x
Вместо *.* задайте правильный шаблон.
мне кажется, что с шаблоном тут не получится выкрутиться.

достаточно просто проверить наличие буквы b на всех чётных местах
например, так:
Код:
var FindRes : integer;
    SR : TSearchRec;
    i: integer;
    s: string;
    isNeed : boolean;
begin
  ListBox1.Clear;
//  FindRes := FindFirst('C:\Users\o?oiaa eu\Desktop\lab2\*.*', faAnyFile, SR);
  FindRes := FindFirst('*.*', faAnyFile, SR);
  while FindRes = 0 do
  begin
    if Not (((SR.Attr and faDirectory) = faDirectory) and
      ((SR.Name = '.') or (SR.Name = '..'))) then
    begin
       s := Uppercase(ChangeFileExt(SR.Name, ''));
       if Length(s)>1 then begin
          i := 2;
          isNeed := true;
          while (i<=Length(s)) and isNeed do begin
            if (s[i] <> 'B' ) then isNeed := false;
            inc(i,2);
          end;

          if isNeed then
                   ListBox1.Items.Add(SR.Name);
       end;

    end;
    FindRes := FindNext(SR);
  end;
  FindClose(SR);
end;
а ещё обратите Ваше внимание, путём банального изменения условия на обратное (через NOT) я добивился возможности упросить код и выкинуть Continue
Serge_Bliznykov вне форума Ответить с цитированием
Старый 06.10.2010, 10:32   #5
hrusha2006
 
Регистрация: 13.09.2010
Сообщений: 7
По умолчанию

круто=) я бы до логических переменных низачто не додумался бы=) спасибо=) очень благодарен=)

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

вот модифицированный код:
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    Button1: TButton;
    Button2: TButton;
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  SR: TSearchRec;
  FindRes: Integer;
    i: integer;
    s: string;
    isNeed : boolean;
    Dir:string;
    mask:string;
implementation

{$R *.dfm}

procedure TForm1.Button2Click(Sender: TObject);
begin
 close;
end;

procedure TForm1.Button1Click(Sender: TObject);
  begin
   if mask = '' then mask := '*.*';
     if Dir[Length(Dir)] <> '\' then Dir := Dir + '\';
       FindRes := FindFirst(Dir+mask, faAnyFile, SR);
  begin
  while FindRes = 0 do
  begin
    if Not (((SR.Attr and faDirectory) = faDirectory) and
      ((SR.Name = '.') or (SR.Name = '..'))) then
    begin
       s:= Uppercase(ChangeFileExt(SR.Name, ''));
       if Length(s)>1 then begin
          i := 2;
          isNeed := true;
          while (i<=Length(s)) and isNeed do begin
            if (s[i] <> 'B' ) then isNeed := false;
            inc(i,2);
          end;

          if isNeed then
                   ListBox1.Items.Add(SR.Name);
       end;

    end;
    FindRes := FindNext(SR);
  end;
  FindClose(SR);
end;
end;
end.

Последний раз редактировалось Stilet; 06.10.2010 в 10:56.
hrusha2006 вне форума Ответить с цитированием
Старый 06.10.2010, 13:03   #6
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

извините, но я тут в упор не вижу рекурсии...
Вы точно уверены, что привели здесь пример рекурсивной функции?
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема при организации поиска в БД. Arcanorum БД в Delphi 5 17.09.2010 20:40
чтение txt фалов Mihanches Общие вопросы Delphi 3 17.09.2010 11:42
Загрузка фалов на сервер BloodWizard PHP 2 03.08.2010 15:55
Задача поиска мнимального пути delete Общие вопросы C/C++ 2 24.12.2008 20:56
Вопрос по организации поиска и расстановки меток Melifaro Компоненты Delphi 4 01.11.2007 09:53