Ich suche mit FindFirstFile Dateien auf der Festplatte und schreibe sie in ein dynamisches Array. Da es nicht sehr ressourcen schonend ist jedes mal das Array um eins zu vergrößern, habe ich mir folgendes gemacht:
Delphi-Quellcode:
Filename := RootFolder + string(wfd.cFileName);
if length(Files) = cnt then
SetLength(Files, length(Files)+100);
Files[cnt] := Filename;
Inc(cnt);
Files ist global, sobald aber der erste rekursive Aufruf kommt ist das Array aber wieder leer:
Delphi-Quellcode:
procedure FindAllFiles(RootFolder: string; Mask: string =
'*.*'; Recurse: Boolean = True);
var
hFindFile : THandle;
wfd : TWin32FindData;
Filename : string;
cnt : Integer;
begin
cnt := 0;
if RootFolder[length(RootFolder)] <> '\' then
RootFolder := RootFolder + '\';
ZeroMemory(@wfd, sizeof(wfd));
wfd.dwFileAttributes := FILE_ATTRIBUTE_NORMAL;
if Recurse then
begin
hFindFile := FindFirstFile(pointer(RootFolder + '\' + '*.*'), wfd);
if hFindFile <> 0 then
try
repeat
if wfd.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY =
FILE_ATTRIBUTE_DIRECTORY then
if (string(wfd.cFileName) <> '.') and (string(wfd.cFileName) <> '..')
then
begin
FindAllFiles(RootFolder + wfd.cFileName, Mask, Recurse);
end;
until FindNextFile(hFindFile, wfd) = False;
finally
FindClose(hFindFile);
end;
end;
hFindFile := FindFirstFile(pointer(RootFolder + '\' + '*.*'), wfd);
if hFindFile <> 0 then
try
repeat
if wfd.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY <>
FILE_ATTRIBUTE_DIRECTORY then
begin
Filename := RootFolder + string(wfd.cFileName);
if length(Files) = cnt then
SetLength(Files, length(Files)+100);
Files[cnt] := Filename;
Inc(cnt);
end;
until FindNextFile(hFindFile, wfd) = False;
finally
FindClose(hFindFile);
setlength(Files, cnt);
end;
end;
Und das verstehe ich nicht ganz. Ich wollte die Routine in einem
nonVCL Programm nutzen, also ohne die
Unit Classes auskommen.