Sicher, dass die Threads durchlaufen und nicht abstürzen?
Delphi fängt Exceptions in TThreads ab (da Windows sonst das ganze Programm hart abschießt), allerdings werden Exceptions im Thread nicht angezeigt, so wie es z.B. die
VCL tut.
Entweder per Try-Except im Thread.Execute
oder im Thread.OnTerminate das
(Thread.FatalException as Exception)
prüfen und anzeigen/loggen.
Gut, abgesehn von fehlenden Ressourcen-Schutzblöcken (Try Finally) fällt auf die Schnelle nichts Schlimmes auf.
Da das in den Unterverzeichnisse nicht auftritt, würde ich einen Fehler in TThreadSearchDocuments.FindFileInPath eher ausschließen,
denn wenn da der Fehler wäre, dann doch in allen Ebenen? Die Funktion ist ja in sich geschlossen und ruft sich selber rekursiv aufruft.
Tipps:
Delphi-Quellcode:
if (Pos(lowercase(FName),lowercase(filename))>0)
if StartsText(FName, filename)
Und ein Verziechnis mit weiteren Attributen ist für dich kein Verzeichnis? (Bit-Maske)
Delphi-Quellcode:
if (sr.Attr = faDirectory)
if (sr.Attr and faDirectory <> 0)
Warum ist da eigentlich mehrfach fast der selbe Code drin (pro TrTyp) und das ganze auch noch doppelt (FAddDirectories) ?
Delphi-Quellcode:
procedure TThreadSearchDocuments.FindFileInPath(Path: string);
var
sr: TSearchRec;
filename: string;
begin
if Self.Terminated then
Exit;
if FindFirst(path+'*.*', faAnyFile, sr)=0 then
try
repeat
if (sr.Name='.') or (sr.Name='..') then
Continue;
Inc(TCount);
DoOnDokumentCount(TCount);
filename:=StringReplace(sr.Name, ' ', '', [rfReplaceAll]);
if (sr.Attr and faDirectory = 0) or FAddDirectories then begin
if .... (FName<>'') .. and StartsText(FName, .. filename) then TrTyp:='Name'
else if (FKZ<>'') .... and StartsText(FKZ, .... filename) then TrTyp:='KZ'
else if (FVIN<>'') ... and StartsText(FVIN, ... filename) then TrTyp:='VIN'
else if (FDebitor<>'') and StartsText(FDebitor, filename) then TrTyp:='KdNr'
else TrTyp:='';
if TrTyp<>'' then begin
TrName:=ExtractFileName(sr.Name); // steht hier nicht eh nur der Filename drin?
TrPath:=Path;
TrDatum:=FileTimeToDateTime(sr.FindData.ftLastWriteTime);
TrGroesse:=sr.Size;
DoOnFoundDokument(TrName, TrTyp, TrPath, TrDatum, TrGroesse);
end;
end;
if FAddDirectories then
FindFileInPath(path+sr.Name+'\');
until Self.Terminated or (FindNext(sr)<>0);
finally
FindClose(sr);
end;
end;
Ist nicht ganz eindeutig, das rumge-pos-se ... Wirklich
StartsText oder doch eher
SameText?
Für SameText, oder eher MatchText, da ja Mehreres:
Delphi-Quellcode:
//const cTrTyp: array[0..3] of string = ('Name', 'KZ', 'VIN', 'KdNr');
if (sr.Attr and faDirectory = 0) or FAddDirectories then begin
if MatchText(filename, [FName, FKZ, FVIN, FDebitor]) then begin
TrName:=ExtractFileName(sr.Name); // steht hier nicht eh nur der Filename drin?
{case IndexText(filename, [FName, FKZ, FVIN, FDebitor]) of
0: TrTyp:='Name';
1: TrTyp:='KZ';
2: TrTyp:='VIN';
3: TrTyp:='KdNr';
else TrTyp:=''; // im ELSE oder vor dem REPEAT initialisiert, damit der Compiler nicht meckert
end;}
TrTyp:=cTrTyp[IndexText(filename, [FName, FKZ, FVIN, FDebitor])];
TrPath:=Path;
TrDatum:=FileTimeToDateTime(sr.FindData.ftLastWriteTime);
TrGroesse:=sr.Size;
DoOnFoundDokument(TrName, TrTyp, TrPath, TrDatum, TrGroesse);
end;
end;
StartsStr StartsText SameStr SameText MatchStr MatchText ... siehe
StrUtils
Testhalber mal ein
Exit;
an den Anfang von TThreadSearchDocuments.FindFileInPath und schauen, ob die Verzeichnisse immernoch offen sind.
Dann ist es definitiv wo anders.