Hallo zusammen,
ich verwende schon lange folgenden Code um nach Dateien zu suchen.
Delphi-Quellcode:
function TuFiles.GetAllFiles(
var slFiles:TStringlist; sFile:
string; bAll, bAllVerz, bNoBAK:Boolean):LongInt;
{++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
{ GetAllFiles }
{------------------------------------------------------------------------}
{ Erstellung : 7. 8.97 }
{ Letzte Änderung : 21. 4.03 }
{------------------------------------------------------------------------}
{ Sucht ab dem übergebenen Verzeichnis in allen eventuellen Unterverzei- }
{ chnissen nach Dateien, die mit der übergebenen übereinstimmen. }
{------------------------------------------------------------------------}
{ Übergabeparameter }
{ slFiles = Enthält die gefundenen Dateien }
{ sFile = Gibt vor, welche Dateien ab welchem Verzeichnis gesucht }
{ werden }
{ bAll = Legt fest, ob alle Dateien gelistet werden }
{ true = es werden alle Dateien gelistet }
{ false = sobald eine Datei gefunden wurde, die mit sFile }
{ übereinstimmt, wird die Suche beendet }
{ bAllVerz = Legt fest, in welchen Verzeichnissen gesucht wird }
{ true = es werden auch alle Unterverzeichnisse durchsucht }
{ false = es wird nur das übergebene Verzeichnis durchsucht }
{ bNoBAK = Legt fest, ob auch Sicherungsdateien gelistet werden }
{ true = Sicherungsdateien werden nicht gelistet }
{ false = Sicherungsdateien werden gelistet }
{++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
var
Search: TSearchRec;
begin
// Application.ProcessMessages;
// if bAbort then Exit;
// Panel2.Caption:=format(' Dokument wird in %s gesucht',[ExtractFilePath(sFile)]);
// Panel2.Refresh;
{ alle Dateien suchen }
if SysUtils.FindFirst(sFile, $23, Search)= 0
then
repeat
if not (bNoBak)
or ((bNoBAK)
and not (BakDatei(Search.
Name)))
then
slFiles.add(UpperCase(ExtractFilePath(sFile)+Search.
Name));
until (SysUtils.FindNext(Search)<>0)
or ((slFiles.Count>0)
and not (bAll));
{$IFDEF Win32}
SysUtils.FindClose(Search);
{$ENDIF}
if ((bAllVerz)
and ((slFiles.Count=0)
or ((slFiles.Count>0)
and bAll)))
then
begin { Unterverzeichnisse durchsuchen }
if (SysUtils.FindFirst(ExtractFilePath(sFile) + '
*.*',fadirectory, Search)= 0)
then
begin
repeat
if((search.attr
and fadirectory)=fadirectory)
and(search.
name[1]<>'
.')
then
GetAllFiles(slFiles, ExtractFilePath(sFile)+ Search.
Name + '
\' + ExtractFileName(sFile),bAll, bAllVerz, bNoBAK);
until SysUtils.FindNext(Search) <> 0;
end;
{$IFDEF Win32}
SysUtils.FindClose(Search);
{$ENDIF}
end;
Result:=slFiles.Count;
end;
Über den Übergabeparameter bAll kann ich die Suche abbrechen, sobald ich die Datei gefunden habe. In meinem Beispiel,
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
slFiles : TStringlist;
begin
if slFiles=nil then slFiles := TStringList.Create;
uHilfs1.SetStart1;
if uFiles.GetAllFiles(slFiles, 'E:\Eigene Bilder\Privat\U-2003-05-31ac.jpg', false, true, true)>0 then
ShowMessage(slFiles[0]+' in '+uHilfs1.GetDeltaTime1+' gefunden')
else
ShowMessage('Keine Datei in '+uHilfs1.GetDeltaTime1+' gefunden');
end;
in dem die Datei in dem Unterverzeichnis "E:\Eigene Bilder\Privat\Digital\U Urlaub\2003 Kroatien" gefunden wird, benötigt die Suche 2.85sec. Führe ich nun dieselbe Suche vom selben Startverzeichnis mit dem Dateimanager 'Total Commander' (s.
http://www.ghisler.com/deutsch.htm) aus, benötigt dieser nur Bruchteile einer Sekunde. Wie kann man selber eine so schnelle Suche programmieren?
Danke für ein paar Tips
Gerd