저의 경우에는 화일 검색은 자주 쓸 일이 있어서.. 콤포넌트를 만들었습니다..
아래 소스를 참고하세요..
From 류..
----------
1. 프로그램 소스
procedure TForm1.Button1Click(Sender: TObject);
begin
SearchDir1.Search('C:\', True);
// SearchDir1.Search('C:\', False); 이면 C: 전체를 찾아냄
end;
procedure TForm1.SearchDir1FindFile(Sender: TObject; Folder,
FileName: String);
begin
Memo1.Lines.Add(FileName);
end;
2. 콤포넌트 소스
unit SearchDir;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
type
TFindFileEvent = Procedure (Sender:TObject; Folder,FileName:String) of Object;
TFindFileInfoEvent = Procedure (Sender:TObject; FileInfo:TSearchRec) of Object;
TFindFolderEvent = Procedure (Sender:TObject; Folder:String) of Object;
TStopEvent = Procedure (Sender:TObject) of Object;
TCompleteEvent = Procedure (Sender:TObject) of Object;
TSearchDir = class(TComponent)
private
{ Private declarations }
FFindFileEvent : TFindFileEvent;
FFindFileInfoEvent : TFindFileInfoEvent;
FFindFolderEvent : TFindFolderEvent;
FStopEvent : TStopEvent;
FCompleteEvent : TCompleteEvent;
FindFileName : String;
protected
{ Protected declarations }
Procedure SearchDirectory(PathName:String; OnlyOne:Boolean);
public
{ Public declarations }
Stop : Boolean;
Procedure Search(PathName,FileName:String; OnlyOne:Boolean); OverLoad;
Procedure Search(PathName:String; OnlyOne:Boolean); Overload;
published
{ Published declarations }
Property OnFindFile : TFindFileEvent Read FFindFileEvent Write FFindFileEvent;
Property OnFindFileInfo : TFindFileInfoEvent Read FFindFileInfoEvent Write FFindFileInfoEvent;
Property OnFindFolder : TFindFolderEvent Read FFindFolderEvent Write FFindFolderEvent;
Property OnStop : TStopEvent Read FStopEvent Write FStopEvent;
Property OnComplete : TCompleteEvent Read FCompleteEvent Write FCompleteEvent;
end;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Ryu', [TSearchDir]);
end;
Procedure TSearchDir.SearchDirectory(PathName:String; OnlyOne:Boolean);
Var
Di : TSearchRec;
Found : Integer;
SearchStr : String;
Begin
SearchStr:= PathName;
If (SearchStr[Length(SearchStr)] = '\') then SetLength(SearchStr, Length(SearchStr)-1);
If Assigned(OnFindFolder) then OnFindFolder(Self, SearchStr);
Found:= FindFirst(SearchStr+'\'+FindFileName, faDirectory, Di);
While Found = 0 do
Begin
Application.ProcessMessages;
If Stop then Exit;
If (Di.Name <> '.' ) and
(Di.Name <> '..') then
Begin
If ((Di.Attr and faDirectory) = faDirectory) and
(not OnlyOne) then SearchDirectory(SearchStr+'\'+Di.Name, OnlyOne)
Else
Begin
If Assigned(OnFindFile) then OnFindFile(Self, SearchStr, Di.Name);
If Assigned(OnFindFileInfo) then OnFindFileInfo(Self, Di);
End;
End;
Found := FindNext(Di);
End;
FindClose(Di);
End;
Procedure TSearchDir.Search(PathName,FileName:String; OnlyOne:Boolean);
Begin
Stop:= False;
FindFileName:= FileName;
SearchDirectory(PathName, OnlyOne);
If Stop and Assigned(OnStop) then OnStop(Self);
If (not Stop) and Assigned(OnComplete) then OnComplete(Self);
End;
Procedure TSearchDir.Search(PathName:String; OnlyOne:Boolean);
Begin
Search(PathName, '*.*', OnlyOne);
End;
end.
|