AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Neue Version von FindAllFiles

Ein Thema von SirThornberry · begonnen am 11. Jun 2005 · letzter Beitrag vom 5. Jun 2006
Antwort Antwort
Seite 2 von 4     12 34   
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#11

Re: Neue Version von FindAllFiles

  Alt 12. Jul 2005, 07:01
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#12

Re: Neue Version von FindAllFiles

  Alt 12. Jul 2005, 07:10
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#13

Re: Neue Version von FindAllFiles

  Alt 12. Jul 2005, 18:43
@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...
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#14

Re: Neue Version von FindAllFiles

  Alt 12. Jul 2005, 18:46
Im Anhang.
OS ist Windows 2000 SP4 mit allen Patches und drum und darn.
Angehängte Dateien
Dateityp: zip findalldingsb_mse_188.zip (2,4 KB, 26x aufgerufen)
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#15

Re: Neue Version von FindAllFiles

  Alt 12. Jul 2005, 18:50
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;
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#16

Re: Neue Version von FindAllFiles

  Alt 12. Jul 2005, 19:06
Ah, jetzt geht es. Wie wäre es mit so was:
FindAllFiles(ListBox1.Items, 'd:', '*.txt *.jpg', True); Also Suche mit mehreren Filtern?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#17

Re: Neue Version von FindAllFiles

  Alt 12. Jul 2005, 19:38
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;
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von Flocke
Flocke

Registriert seit: 9. Jun 2005
Ort: Unna
1.172 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#18

Re: Neue Version von FindAllFiles

  Alt 12. Jul 2005, 20:26
Schön dass es jetzt funktioniert (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).
Volker
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#19

Re: Neue Version von FindAllFiles

  Alt 12. Jul 2005, 20:44
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)
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Thanatos81
(Gast)

n/a Beiträge
 
#20

Re: Neue Version von FindAllFiles

  Alt 13. Jul 2005, 13:23
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!
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:04 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