Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi Bilddateien herausfinden (https://www.delphipraxis.net/206268-bilddateien-herausfinden.html)

Willie1 5. Dez 2020 11:19

Bilddateien herausfinden
 
Hallo,
Delphi-Quellcode:
const
  GRAPHTYPES = '.JPG.JPEG.BMP.DIB.TIF.TIFF.PNG.GIF.ICO.EMF.HEIF.HEIC';
Find := GRAPHTYPES;
...
if Pos(UpperCase(ExtractFileExt(SR.Name)), Find) > 0 then begin//nur Bilder;
Ist das so richtig, um Bildformate aus einem Ordner heraus zu filtern?

Ich sehe schon, mit TDirectory.GetFiles lässt sich das vereinfachen!!!
Gruß Willie.

himitsu 5. Dez 2020 12:46

AW: Bilddateien herausfinden
 
Erstmal was Grundsärtliches:
Delphi-Quellcode:
const
  GRAPHTYPES = '.JPG.JPEG.BMP.DIB.TIF.TIFF.PNG.GIF.ICO.EMF.HEIF.HEIC';

if Pos(UpperCase(ExtractFileExt(SR.Name)), GRAPHTYPES) > 0 then

// ContainsStr oder ContainsText statt POS (Achtung, die Parameter sind hier andersrum ... k.A. wer auf diese saudämliche Idee kam)
// und "Text" hat das Upper/Lower schon eingebaut
if ContainsText(GRAPHTYPES, ExtractFileExt(SR.Name)) then
Und nein, es sei denn du willst auch z.B. das ".H" im ".HEI" finden.
Delphi-Quellcode:
const GRAPHTYPES = '*.JPG*.JPEG*.BMP*.DIB*.TIF*.TIFF*.PNG*.GIF*.ICO*.EMF*.HEIF*.HEIC*';
if ContainsText(GRAPHTYPES, '*' + ExtractFileExt(SR.Name) + '*') then

// Das "*" nehme ich hier oft, weil es in Dateinamen nicht vorkommen kann,
// aber da hier auch der "." am Anfang drin ist, geht auch ohne das erste "*"
const GRAPHTYPES = '.JPG*.JPEG*.BMP*.DIB*.TIF*.TIFF*.PNG*.GIF*.ICO*.EMF*.HEIF*.HEIC*';
if ContainsText(GRAPHTYPES, ExtractFileExt(SR.Name) + '*') then
// oder ... egal wie, du braucht einen DEFINIERTEN Anfang und Ende
const GRAPHTYPES = '.JPG.JPEG.BMP.DIB.TIF.TIFF.PNG.GIF.ICO.EMF.HEIF.HEIC.';
if ContainsText(GRAPHTYPES, ExtractFileExt(SR.Name) + '.') then
// aber ohne "*" am Anfang und Ende aufpassen, denn was liefert eigentlich ExtractFileExt, wenn die Datei keine Extension hat?

if MatchText(ExtractFileExt(SR.Name), ['.JPG', '.JPEG', '.BMP', '.DIB', ...]) then // z.B. eine Array-Kontante oder das Array aus SplitString

Willie1 5. Dez 2020 18:03

AW: Bilddateien herausfinden
 
Danke Himitsu für deine Hinweise, ContainsText kannte ich nicht. Jetzt weiß ich, warum mein Programm "einmal im Jahr" bei der Suche nach Bildern crashte.
Himitsu du hattest mich auf die vielen neuen Möglichkeiten von TDrive, TDirectory usw. aufmerksam gemacht. Jetzt will ich sie nutzen. Es gibt TDirectory.GetFiles mit überladenen Methoden. Kann ich hier nicht schon nach Bildern filtern? Ich habe was gefunden:
Delphi-Quellcode:
IEnumerable<string> FileNames = Directory.GetFiles(@"c:\windows").Where(
                CurFile => CurFile.EndsWith(".exe") || CurFile.EndsWith(".txt"));
Es ist ein C#-Beispiel sieht aber der Delphi-Funktion verdammt ähnlich. Da wird nach exe und txt gefiltert. Die Delphi-Doku hat leider kein Beispiel.
Hier hat jemand die selbe Frage nur in C# :https://entwickler-ecke.de/topic_Dir...n_93844,0.html

Willie.

Aviator 5. Dez 2020 21:52

AW: Bilddateien herausfinden
 
Schau dir mal die Funktion Delphi-Referenz durchsuchenSystem.IOUtils.TDirectory.GetFiles an.

Bzw. hier der Direktlink: http://docwiki.embarcadero.com/Libra...ctory.GetFiles

Da müsstest du etwas mit dem SearchPattern Parameter bzw. dem TFilterPredicate etwas hinbekommen.

Willie1 6. Dez 2020 18:28

AW: Bilddateien herausfinden
 
Mit SearchPattern, SearchOption komme ich klar mit TFilterPredicate nicht. Ist das eine Callback-Funktion? Für SearchOption gibt es ein Beispiel aber nicht für Letzteres. Ich habe auch bei MSDN nach gesehen. Als Hobby-Programmiere fehlen mir die Grundlagen. Mit TFilterPredicate sollen alle Files heraus gefiltert werden, die nicht dem Suchschema entsprechen.
Ich könnte ja ALLE Dateien eines Ordners mit GetFiles einlesen und dann filtern. Aber jetzt habe ich den Ehrgeiz, das heraus zu bekommen. Willie.

Aviator 6. Dez 2020 19:21

AW: Bilddateien herausfinden
 
Schau dir mal diese Funktion von David Heffernan bei SO an. Die sollte dir weiterhelfen. Beachte auch seinen dazugehörigen Hinweis. Der wird vmtl. wichtig, wenn du sehr viele Dateien suchst.

Willie1 7. Dez 2020 11:36

AW: Bilddateien herausfinden
 
Danke so geht es.
Ich habe den Nachtrag gelesen. Da ich ohnehin eine StringList mit Objekten benutze, um die Bildernamen und andere Bildinfos zu speichern, stellt sich die Frage, ob ich dann nicht besser bei FindFirst / FindNext bleibe. Erst alle einzeln einlese und sofort die Bilder herausfiltere, als erst ein StringDynArray anzulegen.
Willie.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:06 Uhr.

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