Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Erweiterte Suchfunktion (https://www.delphipraxis.net/92030-erweiterte-suchfunktion.html)

argonix 13. Mai 2007 16:37


Erweiterte Suchfunktion
 
Hallo! Zum Suchen von Dateien verwende ich bis jetzt folgende Funktion aus der CodeLib:
Delphi-Quellcode:
procedure FindAllFiles(MediaList: TStrings; RootFolder: string; Mask: string ='*'; Recurse: Boolean = True; AddFolderNames: Boolean = False; IgnoreMaskAtFolderNames: Boolean = True);
  procedure LFindAllFiles(AParentFolder: String);
  var LSearchRec: TSearchRec;
  begin
    if FindFirst(AParentFolder + '*', faAnyFile, LSearchRec) = 0 then
    begin
      repeat
      Application.ProcessMessages;
        if (LSearchRec.Name <> '.') and (LSearchRec.Name <> '..') then
        begin
          if LSearchRec.Attr and faDirectory = faDirectory then
          begin
            if AddFolderNames and
               (IgnoreMaskAtFolderNames or Like(AnsiLowerCase(LSearchRec.Name), Mask)) then
              MediaList.AddObject(AParentFolder + LSearchRec.Name, TObject(True));
              Application.ProcessMessages;
            if Recurse then
              LFindAllFiles(AParentFolder + LSearchRec.Name + '\');
          end
          else if Like(AnsiLowerCase(LSearchRec.Name), Mask) then
            MediaList.AddObject(AParentFolder + LSearchRec.Name, TObject(False));
        end;
      until FindNext(LSearchRec) <> 0;
      FindClose(LSearchRec);
    end;
  end;
begin
  Mask := AnsiLowerCase(Mask);
  LFindAllFiles(IncludeTrailingPathDelimiter(RootFolder));
end;
Wie kann ich diese Funktion erweiter, dass Sie
1: Mehrere Masken in einem Suchlauf anwendet (z.B. statt Mask:='*.mp3'; auch Mask:='*.mp3;*.wav'; möglich ist) und
2: Man bestimmte Verzeichnisse (z.B. C:\WINDOWS\) von der Suche ausschließen kann?
--
Danke für die Hilfe.

Christian Seehase 13. Mai 2007 16:44

Re: Erweiterte Suchfunktion
 
Moin Argonix,

da FindFirstFile nur eine Suchmaske zur Zeit zulässt, wirst Du anhand der gefundenen Dateien selber filtern müssen, welche Du haben willst, und welche nicht.
Beispielsweise könntest Du einen weiteren Parameter deklarieren, der dann die gewünschten Extensions enthält ('.mp3.wav.').

Delphi-Quellcode:
if pos(AnsiLowerCase(ExtractFileExt(...))+'.',AsExtensions) > 0 then ....
Analog gilt das dann auch für die auszuschliessenden Pfade, obwohl sich hier wohl eine StringListe als Parameter anböte.

Delphi-Quellcode:
if AExclude.IndexOf(...) > -1 then ...

argonix 14. Mai 2007 11:35

Re: Erweiterte Suchfunktion
 
Das wäre eine Möglichkeit. Aber so dauert die Suche ewig, wenn das Tool erst den kompletten Inhalt eines Laufwerks in einer Liste ablegen muss, die dann durchsucht wird. Geht das vielleicht effizienter? (Es muss ja nicht TSearchRec sein)

argonix 15. Mai 2007 13:01

Re: Erweiterte Suchfunktion
 
Gibt es außer der Windows-Funktion keine andere Suchroutine?

matashen 15. Mai 2007 13:50

Re: Erweiterte Suchfunktion
 
Nö, aber es gibt lösungen

guckst du da nach

Gruß Matthias

vepman 16. Mai 2007 07:52

Re: Erweiterte Suchfunktion
 
Zitat:

Zitat von argonix
Hallo! Zum Suchen von Dateien verwende ich bis jetzt folgende Funktion aus der CodeLib:
[Wie kann ich diese Funktion erweiter, dass Sie
1: Mehrere Masken in einem Suchlauf anwendet (z.B. statt Mask:='*.mp3'; auch Mask:='*.mp3;*.wav'; möglich ist) und
2: Man bestimmte Verzeichnisse (z.B. C:\WINDOWS\) von der Suche ausschließen kann?
--
Danke für die Hilfe.

Diese Funktion in der DP hat mir beim gleichen Problem geholfen. Diese Funktion von Sir Thornbery ist super schnell.
Das Ausschließen musst du dann per Code erledigen.
Leider wurde die Funktion nicht in dieser Form in der Code-Lib aufgenommen.

Gruss vepman


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:44 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz