![]() |
GetFiles SearchPattern
Hallo Leute,
ich will alle Bildformate aus einem Ordner herausfiltern. Die KI schlägt mir folgendes vor:
Delphi-Quellcode:
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.
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); Danke und Gruß Willie. |
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. |
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. |
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); |
AW: GetFiles SearchPattern
Zitat:
Zitat:
|
AW: GetFiles SearchPattern
Liste der Anhänge anzeigen (Anzahl: 1)
Zitat:
|
AW: GetFiles SearchPattern
Zitat:
Delphi-Quellcode:
Das ist meine eigene Idee. Wo die Performance besser ist, weiß ich nicht. Willie.
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; |
AW: GetFiles SearchPattern
Zitat:
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:
:duck:
if Pos('fig.', ReverseString('C:\irgendwo\test.gif')) = 1 then
|
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) |
AW: GetFiles SearchPattern
Ich meine theoretisch sollte das auch funktionieren
Delphi-Quellcode:
Die System.Masks.TMask Klasse scheint aber Fehler zu haben, zumindest wenn sie Filenamen mit mehreren "." sieht ( My.File.Name.jpg ).
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; 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. |
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