Nie sprecyzowałeś co nie działa, nie zlicza, źle zlicza czy nie kompiluje się i jaki błąd. I jak tutaj się później dziwić opryskliwym odpowiedziom @-123 skoro dostajemy taką "wiele mówiącą informację" w stylu "nie działa" i tymbardziej smutne że dostajemy ją po raz 97834324 i to jeszcze od osoby, która jakiś czas jest już na tym forum. Anyway, co do wyszukiwania plików, również w podkatalogach polecam poniższy kod. Dzięki procedurze podanej w parametrze FileSearchOnFindProc
otrzymujesz wynik gdy znaleziono. Dlatego nie problem wtedy zadeklarować na poczatku zmienną globalną, dla pewności przed wyszukaniem ją wyzerować, a w owej procedurze zwiększąć o jeden. Na koncu po wykonaniu procedury FileSearch
można pokazać wynik w zmiennej globalnej. A w razie potrzeb możesz ten kod sobie przerobić tak aby działał wedle potrzeb. No i oczywiście kod pisany w WinAPI także do szczęścia potrzebuje tylko modułu Windows dodanego do sekcji uses i "nie tuczy" on zbytnio wynikowego exeka, jeżeli napiszemy program oczywiście w WinAPI. Zastosowanie procedur do pokazywania wyników oraz postępu - powoduje, że nie trzeba stosować tablic dynamicznych w celu zebrania wyników, bo można je od razu dodawać na przykład do jakiś kontrolek wizualnych jak na przykład ListBox utworzony w oknie dialogowym z zasobów.
//..
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;
//...