Einzelnen Beitrag anzeigen

norwegen60

Registriert seit: 23. Dez 2007
Ort: Schwarzwald
505 Beiträge
 
Delphi 12 Athens
 
#1

Schnelle Dateisuche

  Alt 7. Jan 2008, 11:44
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
  Mit Zitat antworten Zitat