Ok, zgodnie z obietnicą odpisuję teraz z PC. Szkoda, że @roboskobo spocząłeś na laurach i nie chciało się Tobie poszukać w google pliku, o którym pisałem. Pierwszy wynik z Google to wątek na forum unit1. Jest to dokładnie miejsce, gdzie jest właściwy załącznik. Nic tylko się zarejestrować za darmo i pobrać go. Wtedy dawno już miałbyś temat ogarnięty.
Poniższy kod tworzony był pod Delphi 7 i do celów użycia w czystym WinAPI. Także, jeśli chcesz wersji z wsparciem dla UNICODE - przerób sobie kod. Jeśli chcesz się czepiać, jak niektórzy tutaj kiedyś, że niepotrzebnie co chwilę mam sprawdzanie czy coś <> nil
, zamiast zrobić to poprzez zmienną typu boolean
- przerób sobie kod. Jeśli chcesz na listingu mieć też same podkatalogi - przerób sobie kod. Nie podobają się Tobie nazwy zdarzeń i sposób działania - wtedy ponownie, samodzielnie przerób sobie kod. Dostosuj go do własnych potrzeb. Ja się na to nie pogniewam :) To tylko prosty przykład.
type
TFileSearchOnFindProc = procedure(FoundFileName : string);
TFileSearchProgressProc = procedure(CurrentSearchPath : string);
function AddBackSlash(Path : string) : string;
begin
Result := '';
if Path <> '' then
begin
if Path[Length(Path)] <> '\' then
begin
Result := Path + '\';
end
else
begin
Result := Path;
end;
end;
end;
procedure FileSearch(const PathName, FileName : string; const InDir : boolean;
FileSearchOnFindProc : TFileSearchOnFindProc;
FileSearchProgressProc : TFileSearchProgressProc);
var
H : THandle;
Path : string;
WFD : TWIN32FindData;
begin
Path := AddBackSlash(PathName);
if @FileSearchProgressProc <> nil then
begin
FileSearchProgressProc(Path);
end;
H := Windows.FindFirstFile(PChar(Path + FileName), WFD);
if H <> INVALID_HANDLE_VALUE then
begin
try
repeat
if (WFD.dwFileAttributes and FILE_ATTRIBUTE_ARCHIVE =
FILE_ATTRIBUTE_ARCHIVE) or (WFD.dwFileAttributes and
FILE_ATTRIBUTE_NORMAL = FILE_ATTRIBUTE_NORMAL) then
begin
if @FileSearchOnFindProc <> nil then
begin
FileSearchOnFindProc(Path + WFD.cFileName);
end;
end;
until not FindNextFile(H, WFD);
finally
Windows.FindClose(H);
end;
end;
if InDir then
begin
H := Windows.FindFirstFile(PChar(Path + '*.*'), WFD);
if H <> INVALID_HANDLE_VALUE then
begin
try
repeat
if (WFD.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY =
FILE_ATTRIBUTE_DIRECTORY) and (Copy(WFD.cFileName, 1, 1) <> '.') and
(WFD.cFileName <> '..') then
begin
FileSearch(Path + WFD.cFileName, FileName, True,
FileSearchOnFindProc, FileSearchProgressProc);
end;
until not FindNextFile(H, WFD);
finally
Windows.FindClose(H);
end;
end;
end;
end;
procedure FileSearchOnFindProc(FoundFileName : string);
begin
Form1.Memo1.Lines.Add(FoundFileName);
end;
procedure FileSearchProgressProc(CurrentSearchPath : string);
begin
Form1.Caption := CurrentSearchPath;
end;
procedure TForm1.Button1Click(Sender : TObject);
begin
Memo1.Clear;
Memo1.Lines.BeginUpdate;
FileSearch('D:\TEST', '*.*', True, FileSearchOnFindProc, FileSearchProgressProc);
Memo1.Lines.EndUpdate;
end;