Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi GetFiles SearchPattern (https://www.delphipraxis.net/216191-getfiles-searchpattern.html)

Willie1 17. Nov 2024 17:42

GetFiles SearchPattern
 
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.

himitsu 17. Nov 2024 17:55

AW: GetFiles SearchPattern
 
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.

Willie1 17. Nov 2024 18:16

AW: GetFiles SearchPattern
 
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.

himitsu 17. Nov 2024 18:32

AW: GetFiles SearchPattern
 
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);

himitsu 17. Nov 2024 18:37

AW: GetFiles SearchPattern
 
Zitat:

Zitat von Willie1 (Beitrag 1543178)
ist zu schön, um wahr zu sein.

Zitat:

Zitat von himitsu (Beitrag 1543177)
Oder ein FeatureRequest.

Besser du fragst das selbst ... ich glaub fast die ignorieren mich meistens, da im QP.

ringli 18. Nov 2024 09:10

AW: GetFiles SearchPattern
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:

Zitat von Willie1 (Beitrag 1543178)
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.

Willie1 18. Nov 2024 17:54

AW: GetFiles SearchPattern
 
Zitat:

Zitat von ringli (Beitrag 1543182)
Zitat:

Zitat von Willie1 (Beitrag 1543178)
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.

himitsu 18. Nov 2024 18:14

AW: GetFiles SearchPattern
 
Zitat:

aber wie ...
findet auch .gi oder .p

Delphi-Quellcode:
Pos(';' + Ext + ';', string(';.bmp;.jpg;.jpeg;.tif;.gif;.png;.heic;')

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

Delphi-Quellcode:
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.


Delphi-Quellcode:
if Pos('fig.', ReverseString('C:\irgendwo\test.gif')) = 1 then
:duck:

striderx 18. Nov 2024 18:50

AW: GetFiles SearchPattern
 
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)

Rollo62 19. Nov 2024 10:34

AW: GetFiles SearchPattern
 
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.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:55 Uhr.
Seite 1 von 2  1 2      

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