안녕하세요...
델파이를시작한지 두달쯤 되는 초보 델이걸입니다...
^^; 꾸뻑
책을 싸메고 공부를 하다가, 이런 함수를 하나 만들긴 만들었는데,
호출을 이만번하니까 죽네요...
흑흑... 살려주세용...
감사...
고수님께서는... 혹씨
하드디스크에 있는 파일을 모두 찾아서 풀패스를 스트링으로 돌리는... 함수하나
만들어 주시면 정말 감사하겠습니다...
------------------------------------------------------------------------
function TfrmMain.IterateDir(Path: String) : boolean;
var
res: Word;
rec: TSearchRec;
begin
Result := True;
if Path[Length(Path)] <> '' then
Path := Path + '';
FillChar(rec, SizeOf(TSearchRec), 0);
res := FindFirst(Path + '*.*', faAnyFile - faVolumeId, rec);
while res = 0 do begin
if (rec.Attr and faDirectory) > 0 then begin
// if (rec.size > 1024) and (rec.attr <> 16) then
if (rec.Name <> '.') and (rec.Name <> '..') then
if IterateDir(Path + rec.Name) = False then begin
Result := False;
Break;
end;
end
else
CheckFile(Path + rec.Name, rec);
res := FindNext(rec);
Application.ProcessMessages;
if dlgSearchFiles = nil then begin
Result := False;
Break;
end;
end;
SysUtils.FindClose(rec);
end;
고수는 아니구요 ^_^;
윈도그즈처럼 파일찾기를 하는 함수를 한번 구현해 보았습니다.
그러니까, 와일드 카드를 사용할수 있는 함수입니다.
검색예) '*.doc', 'abc.???', 'a*.txt'..등등.. 윈도우즈에서 검색하는 형태로
검색하실 수 있습니다.
저는 리스트박스에 찾은 파일의 풀패쓰와 이름을 쓰게 만들어 두었구요.
검색도중 취소하고 싶으시면 먼저 searchcheck라는 전역변수를 하나 생성한다음
취소버튼을 하나 생성하시고, 취소버튼 이벤트 핸들러에 이 문장을 추가하세요.
searchcheck:= False;
^_^;
검색되고 있는 것을 표현하는 것은 박혜윤님의 몫이겠지요?
현재 검색중인 디렉토리를 상태바에 표현한다든지 하는 형태로요...^_^;
그럼 유용히 사용하시고, 항상 즐거운 프로그래밍 하시길~
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
ListBox1: TListBox;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure FilesSearch( Directory, SearchName: String );
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.FilesSearch( Directory, SearchName: String );
var SR : TSearchRec;
R : integer;
begin
if Directory[Length(Directory)] <> '' then Directory := Directory + '';
R := Sysutils.FindFirst(Directory + SearchName, faAnyFile, sr);
while R = 0 do
begin
if (SR.Attr <> faDirectory) and (SR.Name[1] <> '.') then
if sr.FindData.cAlternateFileName <> '' then
ListBox1.Items.Add(Directory + sr.FindData.cAlternateFileName)
else
ListBox1.Items.Add(Directory + sr.FindData.cFileName);
//아래 라인은 search라는 외부 변수를 만들고 취소버튼을 누를경우 searchcheck:= False 한 경우이다
//if searchcheck = False then Exit;
Application.ProcessMessages;
R := Sysutils.FindNext(sr);
end;
SysUtils.FindClose(Sr);
if FindFirst(Directory + '*.*', faDirectory, SR) = 0 then
begin
repeat
if ((Sr.Attr and faDirectory) = faDirectory) and (SR.Name[1]<>'.') then
begin
//아래 라인은 search라는 외부 변수를 만들고 취소버튼을 누를경우 searchcheck:= False 한 경우이다
//if searchcheck = False then Exit;
FilesSearch(Directory+SR.Name+'', SearchName); // 재귀호출
end;
Application.ProcessMessages;
until (FindNext(SR) <> 0);
end;
SysUtils.FindClose(sr);
end;
//사용예) '*.doc', 'abc.???', 'a*.txt'..등등..
//윈도그즈에서 검색하는 형태로 하실 수 있습니다.
procedure TForm1.Button1Click(Sender: TObject);
var Dir: String;
begin
ListBox1.Clear;
Dir:= 'c:';
FilesSearch(Dir, Edit1.Text);
end;
end.