Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

findFirst и findNext [D6, WinXP]


Pasha L ©   (2005-06-05 00:55:00) 

Здравствуйте. У меня вопросы, связанные с findFirst и findNext.
1) Что представляют собой постоянные faDirectory и faVolumeID;
2) Как и чем определяется порядок нахождения файлов;
3) Как сделать так, чтобы поиск распространялся только на папки. Сначала я думал, что faDirectory именно для этого. Но он выдает и файлы тоже.
Надеюсь на вашу помощь. Спасибо.


Pasha L   (2005-06-07 23:56:00) [1]

спасибо. работает


Alexander Panov   (2005-06-05 19:36:00) [2]

{$WARN SYMBOL_PLATFORM OFF}
unit Unit1;

interface

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

type
 TForm1 = class(TForm)
   Button4: TButton;
   Edit1: TEdit;
   RadioGroup1: TRadioGroup;
   Memo1: TMemo;
   procedure FormCreate(Sender: TObject);
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
   procedure RadioGroup1Click(Sender: TObject);
   procedure Button4Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 List: TStringList;
implementation

{$R *.dfm}

procedure Scan(Dir: String;L: TStringList);
var
   Path: String;
   SR: TSearchRec;
begin
   Path := IncludeTrailingBackSlash(Dir);
   if FindFirst(Path+'*.*',faAnyFile,SR)=0 then
   begin
       try
           repeat
               if (SR.Name='.') or (SR.Name='..') then Continue;
               if (SR.Attr and faDirectory)=faDirectory then
               begin
                   L.Objects[L.Add(Path+SR.Name)] := Pointer(SR.Attr);
                   Scan(Path+SR.Name,L);
               end;
           until FindNext(SR)<>0;
       finally
           Sysutils.FindClose(SR);
       end;
   end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
   List := TStringList.Create;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   List.Free;
end;

procedure TForm1.RadioGroup1Click(Sender: TObject);
var
   i: Integer;
   Attr: Integer;
begin
   Attr := 0;
   Memo1.Lines.Clear;
   Memo1.Lines.BeginUpdate;
   try
       case RadioGroup1.ItemIndex of
           0: Memo1.Lines.Assign(List);
           1: Attr := faHidden;
           2: Attr := faDirectory;
           3: Attr := faVolumeId;
       end;
       if RadioGroup1.ItemIndex = 0 then Exit;
       for i := 0 to List.Count-1 do
       begin
           if (Integer(List.Objects[i]) and Attr)=Attr then Memo1.Lines.Add(List[i]);
       end;
   finally
       Memo1.Lines.EndUpdate;
   end;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
   List.Clear;
   Scan(Edit1.Text,List);
   RadioGroup1Click(Self);
end;

end.


Pasha L   (2005-06-05 18:09:00) [3]

Anatoly Podgoretsky, у меня выводится одно и то же. В этой программе в StringGrid1 в 4 колонки (faanyfile, fadirectory, favolumeid, fahidden) выводятся файлы и папки, содержащиеся у меня в c:\games. В первых двух колонках в конце концов оказываются все и файлы и папки, а в двух последних все файлы (без папок)
unit Unit1;

interface

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

type
 TForm1 = class(TForm)
   StringGrid1: TStringGrid;
   procedure FormCreate(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
 a:tsearchrec;
 i,n,n2,now:integer;
 str:string;
begin
 for n:=0 to 3 do begin
   case n of
     0:begin
       now:=faanyfile;
       str:='faanyfile';
     end;
     1:begin
       now:=fadirectory;
       str:='fadirectory';
     end;
     2:begin
       now:=favolumeid;
       str:='favolumeid';
     end;
     3:begin
       now:=fahidden;
       str:='fahidden';
     end;
   end;
   n2:=0;
   stringgrid1.Cells[n,0]:=str;
   i:=findfirst('c:\games\*',now,a);
   while i=0 do begin
     n2:=n2+1;
     if stringgrid1.RowCount<n2 then
       stringgrid1.RowCount:=n2+2;
     stringgrid1.Cells[n,n2]:=a.Name;
     i:=findnext(a);
   end;
   findclose(a);
 end;  
end;

end.


Anatoly Podgoretsky   (2005-06-05 17:43:00) [4]

Pasha L   (05.06.05 17:23) [11]
Чем тогда отличается поиск с faanyfile от поиска с fadirectory, если они выводят одно и тоже. favolumeid и fahidden тоже

Они выводят не одно и тоже.


DiamondShark   (2005-06-05 17:37:00) [5]


> DiamondShark, извини за непонятливость, но можно по-русски?

Вроде, по-русски написано. Какое слово не понятно?


> такое подействует?

А ты вообще смысл написанного понимаешь? Например, что является результатом операции and.


Pasha L   (2005-06-05 17:23:00) [6]

И всё же
> Anatoly Podgoretsky  
> faAnyFiles

Чем тогда отличается поиск с faanyfile от поиска с fadirectory, если они выводят одно и тоже. favolumeid и fahidden тоже выводят одно и то же, хоть выводимые ими файлы не являются ни скрытыми файлами, ни метками тома.


Pasha L   (2005-06-05 17:17:00) [7]

DiamondShark, извини за непонятливость, но можно по-русски?
И ещё. Можно ли сделать так
now:=fahidden; //или другая константа}
//потом идет поиск по now
//и проверка:
if (SearchRecStruct.Attr and now)=now // и тд и тп

такое подействует?


DiamondShark   (2005-06-05 16:59:00) [8]


> DiamondShark, зачем сравнивать faDirectory с faDirectory
> если они и так, понятное дело, равны?

А faDirectory с faDirectory нигде и не сравниваются.
Сравнивается результат побитовой логической операции "И" над Attr и faDirectory со значением faDirectory.
Посмотри численное значение faDirectory. Это константа с одним единичным битом. А Attr может содержать другие биты.


Pasha L   (2005-06-05 16:53:00) [9]

DiamondShark, зачем сравнивать faDirectory с faDirectory если они и так, понятное дело, равны?


Pasha L   (2005-06-05 16:48:00) [10]


> Затем, что это битовое поле. Там могут быть и другие флаги.

Не понял


Anatoly Podgoretsky   (2005-06-05 16:33:00) [11]

Pasha L   (05.06.05 16:22) [4]
faAnyFiles


DiamondShark   (2005-06-05 16:27:00) [12]


> 1) Зачем писать if (SearchRecStruct.Attr and faDirectory)=faDirectory
> , а не просто if SearchRecStruct.Attr=faDirectory ;


Затем, что это битовое поле. Там могут быть и другие флаги.


Pasha L   (2005-06-05 16:22:00) [13]

Ещё несколько вопросов:
1) Зачем писать if (SearchRecStruct.Attr and faDirectory)=faDirectory, а не просто if SearchRecStruct.Attr=faDirectory;
2) Применив эту запись, я смог вывести файлы (в данном случае -  папки) только с fadirectory. Остальные значения почему-то не делают своего дела. Почему?
3) Anatoly Podgoretsky, но тогда можно было бы сделать так, чтобы поиск распространялся на все виды файлов и папок, а потом уже с помощью проверки осуществлять фильтрацию. Чувствую, я просто чего-то не могу понять.


Anatoly Podgoretsky   (2005-06-05 13:31:00) [14]

Для того что бы получить кроме рядовых файлов еще и специальные.


Pasha L   (2005-06-05 13:20:00) [15]

Тогда зачем же в findfirst прописывать faDirectory, раз потом всё равно надо проверать?


Alexander Panov   (2005-06-05 01:43:00) [16]

1.
faVolumeID $00000008 Volume ID files
faDirectory $00000010 Directory files

Как видно из хелпа - метка тома и каталог.

2.
 Только лишь расположением в таблице файлов.

3.
 при получении атрибутов проверять на соответствие:

  if (SearchRecStruct.Attr and faDirectory)=faDirectory then {это каталог};


Наверх

Титульная страница Поиск, карта сайта Написать письмо