AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

GetFiles SearchPattern

Ein Thema von Willie1 · begonnen am 17. Nov 2024 · letzter Beitrag vom 19. Nov 2024
Antwort Antwort
Seite 1 von 2  1 2      
Willie1

Registriert seit: 28. Mai 2008
656 Beiträge
 
Delphi 10.1 Berlin Starter
 
#1

GetFiles SearchPattern

  Alt 17. Nov 2024, 18:42
Hallo Leute,
ich will alle Bildformate aus einem Ordner herausfiltern. Die KI schlägt mir folgendes vor:
Delphi-Quellcode:
uses
  System.SysUtils, System.IOUtils;

procedure FindAllImageFiles(const Path: string);
var
  ImageFiles: TStringDynArray;
  SearchPattern: string;
begin
  // Definiere die Suchmuster für die gängigen Bildformate
  SearchPattern := '*.jpg;*.jpeg;*.bmp;*.png;*.gif;*.tiff;*.ico;*.heif;*.heic';
  
  // Verwende TDirectory.GetFiles, um die Dateien zu finden
  ImageFiles := TDirectory.GetFiles(Path, SearchPattern, TSearchOption.soAllDirectories);
Ich meine, das mit dem Strichpunkt auch schon mal gelesen zu haben. Aber es funktioniert nicht. In der Delphi-Dokumentation steht nur "z.B. *.exe" nicht "*.bmp;*.jpg; ...". Eine weitere Erklärung gibt es nicht.

Danke und Gruß Willie.
Gut hören kann ich schlecht, schlecht sehen kann ich gut - Ersteres stimmt nicht, das zweite schon.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.058 Beiträge
 
Delphi 12 Athens
 
#2

AW: GetFiles SearchPattern

  Alt 17. Nov 2024, 18:55
Das ist EINE FileMask.

Entweder erst alles suchen und dann rausfiltern
oder du gibst eine Suchmethode an (gern auch anonym) und filterst dort beim Suchen.

Oder mehrmals suchen und die Ergebnisse kombinieren.
Oder ein FeatureRequest.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Willie1

Registriert seit: 28. Mai 2008
656 Beiträge
 
Delphi 10.1 Berlin Starter
 
#3

AW: GetFiles SearchPattern

  Alt 17. Nov 2024, 19:16
Okay Himitsu,

das ist also eine KI-Ente. Als ich bei der KI nachgefragt habe, bekam ich heraus, was du vorschlägst. Die KI schlägt jetzt ein array of string für SearchPattern vor!

Ich habe verstanden und weiß, wie es geht. Die "Suchmaske" mit den ; ist zu schön, um wahr zu sein.

Willie.
Gut hören kann ich schlecht, schlecht sehen kann ich gut - Ersteres stimmt nicht, das zweite schon.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.058 Beiträge
 
Delphi 12 Athens
 
#4

AW: GetFiles SearchPattern

  Alt 17. Nov 2024, 19:32
Muß ich die KI jetzt verklagen, weil sie meine Ideen klaut?

Delphi-Quellcode:
Files := nil;
for var SP in '*.jpg;*.jpeg;*.bmp;*.png;*.gif;*.tiff;*.ico;*.heif;*.heic'.Split([';']) do
  Files := Files + TDirectory.GetFiles(Path, SP, TSearchOption.soAllDirectories);

Files := TDirectory.GetFiles(Path, '*.*', TSearchOption.soAllDirectories,
  function(const Path: string; const SearchRec: TSearchRec): Boolean
  begin
    Result := MatchText(ExtractFileExt(SearchRec.Name),
      ['.jpg', '.jpeg', '.bmp', '.png', '.gif', '.tiff', '.ico', '.heif', '.heic']);
  end);
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.058 Beiträge
 
Delphi 12 Athens
 
#5

AW: GetFiles SearchPattern

  Alt 17. Nov 2024, 19:37
ist zu schön, um wahr zu sein.
Oder ein FeatureRequest.
Besser du fragst das selbst ... ich glaub fast die ignorieren mich meistens, da im QP.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
ringli

Registriert seit: 7. Okt 2004
509 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: GetFiles SearchPattern

  Alt 18. Nov 2024, 10:10
Ich habe verstanden und weiß, wie es geht. Die "Suchmaske" mit den ; ist zu schön, um wahr zu sein.
Im Anhang eine Demo wie es funktioniert.
Angehängte Dateien
Dateityp: zip GetFiles-Demo.zip (69,4 KB, 11x aufgerufen)
  Mit Zitat antworten Zitat
Willie1

Registriert seit: 28. Mai 2008
656 Beiträge
 
Delphi 10.1 Berlin Starter
 
#7

AW: GetFiles SearchPattern

  Alt 18. Nov 2024, 18:54
Ich habe verstanden und weiß, wie es geht. Die "Suchmaske" mit den ; ist zu schön, um wahr zu sein.
Im Anhang eine Demo wie es funktioniert.
Hier im Forum bekommt man immer eine gute Lösung. Danke. Aber wie wäre es damit:
Delphi-Quellcode:
function FilterFiles(const Path, Mask: string): TStringDynArray;
var
  TypeFilter: TDirectory.TFilterPredicate;
  Ext: Tfilename;
begin
  TypeFilter := function(const Path: string; const SR: TSearchRec): Boolean
  begin
    Ext :=LowerCase(ExtractFileext(SR.Name));
    Result := Pos(Ext, string('.bmp;.jpg;.jpeg;.tif;.gif;.png;.heic;')) > 0;
  end;
  Result := TDirectory.GetFiles(Path, Mask, TypeFilter);
end;
Das ist meine eigene Idee. Wo die Performance besser ist, weiß ich nicht. Willie.
Gut hören kann ich schlecht, schlecht sehen kann ich gut - Ersteres stimmt nicht, das zweite schon.

Geändert von Willie1 (18. Nov 2024 um 18:58 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.058 Beiträge
 
Delphi 12 Athens
 
#8

AW: GetFiles SearchPattern

  Alt 18. Nov 2024, 19:14
Zitat:
aber wie ...
findet auch .gi oder .p

Pos(';' + Ext + ';', string(';.bmp;.jpg;.jpeg;.tif;.gif;.png;.heic;')
aber weil man hier vorne schon einen Punkt hat, kann man den mit benutzen
Pos(Ext + ';', string('.bmp;.jpg;.jpeg;.tif;.gif;.png;.heic;')
Pos(Ext + '.', string('.bmp.jpg.jpeg.tif.gif.png.heic.')



PS: Du wirst es nicht glauben, aber MatchText war absichtlich ausgewählt, da es funktionial super, sicher und schnell passt.

Pos() > bzw. <> 0
entspricht ContainsStr

LowerCase + Pos
entspricht ContainsText

SameText / SameStr
MatchText / MatchStr
IndexText / IndexStr
...

Und mit EndsText müßte man nichtmal den Dateiname trennen, aber das geht nur mit "einer" Dateiendung gleichzeitig.


if Pos('fig.', ReverseString('C:\irgendwo\test.gif')) = 1 then
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (18. Nov 2024 um 19:28 Uhr)
  Mit Zitat antworten Zitat
striderx

Registriert seit: 11. Feb 2007
Ort: Bergisch Gladbach
207 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: GetFiles SearchPattern

  Alt 18. Nov 2024, 19:50
wie wäre es hiermit (Beispiel sExtensions: '*.jpg;*.jpeg;*.tif'):

Delphi-Quellcode:
function GetFilesEx(sPath, sExtensions: String;
                    var sdaFiles: tStringDynArray;
                    IncludeSubdirectories: Boolean): Boolean;

var
  I: Word;
  sdaMasks: tStringDynArray;
  Predicate: tDirectory.TFilterPredicate;

begin
  Result := False;

  if (sPath = '') or
     (not tDirectory.Exists(sPath)) then begin
     ShowMsg('ungültiger Pfad', 'GetFilesEx', mb_OK, mb_IconInformation);
     Exit;
  end;
  sPath := IncludeTrailingPathDelimiter(sPath);

  if sExtensions = 'then begin
     ShowMsg('ungültige Dateierweiterung(en)', 'GetFilesEx', mb_OK,
             mb_IconInformation);
     Exit;
  end;

  sdaMasks := SplitString(sExtensions, ';');
  for I := 0 to High(sdaMasks) do begin
      if Pos('.', sdaMasks[I]) = 1 then sdaMasks[I] := '*' + sdaMasks[I]
      else if Pos('*.', sdaMasks[I]) = 0 then sdaMasks[I] := '*.' + sdaMasks[I];
  end;

  Predicate :=
       function(const Path: string; const SearchRec: TSearchRec): Boolean

       var
         Mask: String;

       begin
         for Mask in sdaMasks do
             if MatchesMask(SearchRec.Name, Mask) then Exit(True);
         Exit(False);
       end;

  try
    if IncludeSubDirectories then
       sdaFiles := tDirectory.GetFiles(sPath, TSearchOption.soAllDirectories,
                                       Predicate)
    else sdaFiles := tDirectory.GetFiles(sPath, Predicate);
    Result := True;
  except
    on E: Exception do begin
       ShowMsg(E.Message, 'GetFilesEx', mb_OK, mb_IconError);
    end;
  end;
end;

(ShowMsg ist meine eigene Message-Box)
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.087 Beiträge
 
Delphi 12 Athens
 
#10

AW: GetFiles SearchPattern

  Alt Gestern, 11:34
Ich meine theoretisch sollte das auch funktionieren

Delphi-Quellcode:
LFiles := TDirectory.GetFiles( LBasePath, '*.jpg; *.png'; TSearchOption.AllDirectories );
...

class function TDirectory.GetFiles(const Path, SearchPattern: string; const SearchOption: TSearchOption ): TStringDynArray;
begin
  CheckGetFilesParameters(Path, SearchPattern);

  Result := DoGetFiles(Path, SearchPattern, SearchOption, nil);
end;
Die System.Masks.TMask Klasse scheint aber Fehler zu haben, zumindest wenn sie Filenamen mit mehreren "." sieht ( My.File.Name.jpg ).
Deshalb nutze ich ein eigenes Prädikat auch immer außerhalb, ich meine auch, dass die Filterfunktion innerhalb TDirectory nicht besonders effizient umgesetzt ist.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      

 

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 06:35 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