Delphi-PRAXiS
Seite 2 von 4     12 34      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Neue Version von FindAllFiles (https://www.delphipraxis.net/47450-neue-version-von-findallfiles.html)

SirThornberry 12. Jul 2005 07:01

Re: Neue Version von FindAllFiles
 
ich hab nochmal die richtige version in meinem Beitrag vom "12.07.2005 07:38" eingefügt.
Die falsche Zeile ist dort auch berichtigt, die Zeile wurde im ersten Beitrag versehentlich falsch geändert...
@Flocke: deine Variante war fast richtig, der erste Parameter (FileList) gehört allerdings weg da er von der äußeren Procedure bereits gehalten wird und somit in der inneren nicht nötig ist.

Luckie 12. Jul 2005 07:10

Re: Neue Version von FindAllFiles
 
Nein, ich habe deine letzte FindAllFiles Prozedur direkt kopiert und deinen Beispiel-Aufruf. Die Listbox bleibt leer und ich habe bessmmt Text-Dateien auf dem durchsuchten Laufwerk.

SirThornberry 12. Jul 2005 18:43

Re: Neue Version von FindAllFiles
 
@Luckie: ich hab das ganze heute kurz vor acht nochmal probiert nach dem ich es abgeändert hatte und es hat funktioniert. Kannst du mir dein Testprojekt mal mailen - vielleicht überseh ich ja irgendwas...

Luckie 12. Jul 2005 18:46

Re: Neue Version von FindAllFiles
 
Liste der Anhänge anzeigen (Anzahl: 1)
Im Anhang.
OS ist Windows 2000 SP4 mit allen Patches und drum und darn.

SirThornberry 12. Jul 2005 18:50

Re: Neue Version von FindAllFiles
 
Ich hab den Fehler gefunden. Die Version von Like die ich bei mir in einer Extra-Unit hab ist schon etwas älter und dort sind die Parameter der funktion "like" vertauscht. (wer kommt nur auf die Idee die Parameter im Nachhinein zu vertauschen *grummel*). Hier jetzt die Version die mit der aktuellen "Like" funktion getestet wurde.
Delphi-Quellcode:
procedure FindAllFiles(FileList: 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
        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
              FileList.AddObject(AParentFolder + LSearchRec.Name, TObject(True));
            if Recurse then
              LFindAllFiles(AParentFolder + LSearchRec.Name + '\');
          end
          else if Like(AnsiLowerCase(LSearchRec.Name), Mask) then
            FileList.AddObject(AParentFolder + LSearchRec.Name, TObject(False));
        end;
      until FindNext(LSearchRec) <> 0;
      FindClose(LSearchRec);
    end;
  end;
begin
  Mask := AnsiLowerCase(Mask);
  LFindAllFiles(IncludeTrailingPathDelimiter(RootFolder));
end;

Luckie 12. Jul 2005 19:06

Re: Neue Version von FindAllFiles
 
Ah, jetzt geht es. Wie wäre es mit so was:
Delphi-Quellcode:
FindAllFiles(ListBox1.Items, 'd:', '*.txt *.jpg', True);
Also Suche mit mehreren Filtern?

SirThornberry 12. Jul 2005 19:38

Re: Neue Version von FindAllFiles
 
super Idee, und schon eingebaut
Delphi-Quellcode:
procedure FindAllFiles(FileList: TStrings; RootFolder: string; Mask: string = '*'; Recurse: Boolean = True; AddFolderNames: Boolean = False; IgnoreMaskAtFolderNames: Boolean = True);
  procedure LFindAllFiles(AParentFolder: string; AMasks: TStrings);
    function LIsInMasks(AFilename: String): Boolean;
    var LCount: Integer;
    begin
      result := False;
      for LCount := 0 to AMasks.Count - 1 do
      begin
        if Like(AMasks.Strings[LCount], AFilename) then
        begin
          result := True;
          break;
        end;
      end;
    end;
  var LSearchRec        : TSearchRec;
  begin
    if FindFirst(AParentFolder + '*', faAnyFile, LSearchRec) = 0 then
    begin
      repeat
        if (LSearchRec.Name <> '.') and (LSearchRec.Name <> '..') then
        begin
          if LSearchRec.Attr and faDirectory = faDirectory then
          begin
            if AddFolderNames and
              (IgnoreMaskAtFolderNames or LIsInMasks(AnsiLowerCase(LSearchRec.Name))) then
              FileList.AddObject(AParentFolder + LSearchRec.Name, TObject(True));
            if Recurse then
              LFindAllFiles(AParentFolder + LSearchRec.Name + '\', AMasks);
          end
          else if LIsInMasks(AnsiLowerCase(LSearchRec.Name)) then
            FileList.AddObject(AParentFolder + LSearchRec.Name, TObject(False));
        end;
      until FindNext(LSearchRec) <> 0;
      FindClose(LSearchRec);
    end;
  end;
var LMasks: TStringList;
begin
  LMasks := TStringList.Create;
  LMasks.Sorted := True;
  LMasks.Duplicates := dupIgnore;
  LMasks.Delimiter := '|';
  LMasks.DelimitedText := AnsiLowerCase(Mask);
  LFindAllFiles(IncludeTrailingPathDelimiter(RootFolder), LMasks);
  LMasks.Free;
end;
Als Delimiter wird "|" verwendet da dieses Zeischen nicht im Dateinamen vorkommen kann.
Beispielaufruf (Zeigt alle *.txt und *.sys auf Laufwerk C und Unterordnern an)
Delphi-Quellcode:
  ListBox1.Items.BeginUpdate;
  FindAllFiles(ListBox1.Items, 'c:', '*.txt|*.sys', True);
  ListBox1.Items.EndUpdate;

Flocke 12. Jul 2005 20:26

Re: Neue Version von FindAllFiles
 
Schön dass es jetzt funktioniert :thumb: (dafür dass ich "blinde" Korrekturvorschläge gegeben habe, lag ich gar nicht soooo schlecht... 8) )

Was ich noch schön/besser fände:

1. Du könntest die Suchparameter als Typ definieren, also:
Delphi-Quellcode:
TFindAllFilesOption = ( fafoRecurse, fafoAddFolderNames, fafoIgnoreMaskAtFolderNames );
TFindAllFilesOptions = set of TFindAllFilesOption
Dann reduzierst du die Anzahl an Parametern und es ist später auch leicht erweiterbar, ohne dass du den Prototypen ändern musst.

2. Das "Standard"-Trennzeichen zwischen Patterns ist das Semikolon (das nimmt auf jeden Fall der Explorer im Suchdialog), also: "*.bmp;*.jpg". Ggf. kannst du das ja noch als Parameter machen (aber dann wird die Parameterliste wieder länger).

SirThornberry 12. Jul 2005 20:44

Re: Neue Version von FindAllFiles
 
ich weiß das bei windows standardmäßig ";" verwendet wird. Allerdings kann dieses Zeischen auch im Dateinamen vorkommen und ist somit nicht wirklich geeignet (keine Ahnung warum Microsoft das für die Suche verwendet hat)

Thanatos81 13. Jul 2005 13:23

Re: Neue Version von FindAllFiles
 
Kann es sein, dass du beim letzten Update (mehrere Masken) wieder die Parameter von "Like" vertauscht hast? Bei mir funktionierte deine sehr hilfreiche Funktion leider nicht.

Nachdem ich die Parameter beim Aufruf von Like vertauscht hab, funktioniert es wunderbar.

Aber Hut ab, wirklich eine sehr praktische Funktion! :thumb:


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:25 Uhr.
Seite 2 von 4     12 34      

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