Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.06.29;
Скачать: CL | DM;

Вниз

findFirst и findNext   Найти похожие ветки 

 
Pasha L   (2005-06-05 00:55) [0]

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


 
Alexander Panov ©   (2005-06-05 01:43) [1]

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

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

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

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

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


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

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


 
Anatoly Podgoretsky ©   (2005-06-05 13:31) [3]

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


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

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


 
DiamondShark ©   (2005-06-05 16:27) [5]


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


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


 
Anatoly Podgoretsky ©   (2005-06-05 16:33) [6]

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


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


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

Не понял


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

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


 
DiamondShark ©   (2005-06-05 16:59) [9]


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

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


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

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

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


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

И всё же
> Anatoly Podgoretsky  
> faAnyFiles

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


 
DiamondShark ©   (2005-06-05 17:37) [12]


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

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


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

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


 
Anatoly Podgoretsky ©   (2005-06-05 17:43) [13]

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

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


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

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.


 
Alexander Panov ©   (2005-06-05 19:36) [15]

{$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-07 23:56) [16]

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



Страницы: 1 вся ветка

Текущий архив: 2005.06.29;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.026 c
4-1114244511
_avoid
2005-04-23 12:21
2005.06.29
Внешнее железо


3-1116611965
Вольман Виктор
2005-05-20 21:59
2005.06.29
SQL к ADO


1-1118114964
ORMADA
2005-06-07 07:29
2005.06.29
DragDrop


4-1114784588
Виталик
2005-04-29 18:23
2005.06.29
Соответствие классов в Delphi и Си


8-1110129109
anamal
2005-03-06 20:11
2005.06.29
Как убрать мигание?