Delphi. Rekursiv kald stopper
Hej.Jeg har ca 33.000 billedfiler.
Filerne er i nogle undermapper med følgende struktur:
FællesOvermappe
- A01
- A02
.....
- s39
- s40
Der er omkring 700 undermapper.
Inde i hver mappe ligger der op til 900 jpg-filer, der to og to skal samles til et billede og og det samlede billede derefter gemmes.
Mit problem er, at programmet stopper når den første (A01) undermappe er gennemløbet.
Jeg fandt kernen til programmet på nettet (jeg kan ikke genfinde det), og efter lidt tilretninger ser det således ud:
(Filnavnene er altid sådan: A02-234a(eller b).jpg)
Function FileLook(Filespec: string): Boolean;
var
validres, DotPos, Acnt, Bcnt: integer;
SearchRec: TSearchRec; {required by 'FindFirst and FindNext' functions }
Flname, Fnm: string; //c:\Hofmansen\Alle Bearbejdede\Alle_A-B_filer\*.*
{SearchRec does not return the full path in the name variable in the record,
so 'DirPath' is used to store the full path name, and 'FullPathName' holds the Full Path Name plus the file name or filter spec while 'Flname' holds the filter or filename}
begin
DirPath := ExtractFilePath(FileSpec); {keep track of the path ie: c:\folder\}
Result:= DirectoryExists(DirPath); {Check for valid directory - include FileCtrl in the uses statement}
If not Result then exit; {Invalid directory then exit}
Flname := ExtractFileName(FileSpec); {keep track of the name or filter}
validres := FindFirst(FileSpec, faAnyFile, SearchRec); {find first file}
while validres = 0 do {if a matching file exists loop}
begin
If (SearchRec.Name[1] <> '.') then {ignore . and .. dirs}
begin
count := count+1;
FullPathName := DirPath + SearchRec.Name;
Fnm := SearchRec.Name;;
if AnsiPos(ExtractFileExt(SearchRec.Name), '.jpg') > 0 then
Begin
//Er det en A eller B-fil
DotPos := Pos('.',Fnm);
if (Fnm[DotPos-1] = 'a') OR (Fnm[DotPos-1] = 'A') then
Begin
FileAName := FullPathName; //Bruges i prog. til at samle billederne
Acnt := count;
End;
if (Fnm[DotPos-1] = 'b') OR (Fnm[DotPos-1] = 'B') then
Begin
FileSaveName := Fnm; //Til SamlFiler
FileBName := FullPathName;
Bcnt := count;
//Er de lige efter hinanden
if Acnt+1 = Bcnt then
Begin //Her kan billedbehndlingen foretages
SamlFiler(); //Virker OK med samling og gemme
End;
End;
application.processmessages(); //For at kunne stoppe programmet
End;
If (SearchRec.Attr and faDirectory > 0) then {it is a directory, not a file}
FileLook(FullPathName+'\'+ Flname);
{the above line is the recursive call to search the subdirectory.
The trailing slash is added to the path as well as the filter filter or filename}
end; {end if statement}
validres:=FindNext(SearchRec); {get next record before continuing conditional while loop}
end; {end while loop}
end; {end function}
Nogen forslag til hvad jeg gør forkert.