![]() |
Re: Neue Version von FindAllFiles
Zitat:
|
Re: Neue Version von FindAllFiles
Ihr habt Recht, ich hatte es schon wieder vertauscht :oops:
Hier also jetzt hoffentlich wieder richtig.
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(AFilename, AMasks.Strings[LCount]) 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; |
Re: Neue Version von FindAllFiles
Hi,
Du könntest doch anstatt der Masken und der Like einfach die ![]() mfG mirage228 |
Re: Neue Version von FindAllFiles
ich WILL den Delimter ";" nicht verwenden weil das zum Konfilikt führt wenn in einem Dateinamen ";" vorkommt oder man eben danach sucht. Ich finde es bedeutend sinnvoller einen Delimiter zu verwenden der NICHT in Dateinamen vorkommen kann... - Werd mir die Funktion mal mit anschauen, vielleicht kann man da ja irgendwas mit Delimiter setzen...
|
Re: Neue Version von FindAllFiles
Zitat:
Ich befürchte aber, dass PathMatchSpec wirklich nur den Windows Delimiter ";" erlaubt... mfG mirage228 |
Re: Neue Version von FindAllFiles
naja, so wie ich das der hilfe entnommen hab kann ich da nicht mehre Masken verwenden (';') also werd ich da wie bei der Like-Variante das für jede extension einzeln aufrufen und somit spielt der Delimiter keine Rolle. In welcher Delphiunit ist eigentlich die Funktion "PathMatchSpec" defniert?
[Edit]Hat sich erledigt, hab die Funktion selbst eingebunden[/Edit] |
Re: Neue Version von FindAllFiles
Zitat:
Delphi-Quellcode:
mfG
function PathMatchSpec(pszFile, pszSpec: PAnsiChar): BOOL; stdcall;
external 'shlwapi.dll' name 'PathMatchSpecA'; mirage228 |
Re: Neue Version von FindAllFiles
Ich kann die Funktion nicht verwenden da sie wie geahnt bereits den ";" als delimiter zulässt.
Habe ich jetzt allerdings einen Dateinamen "abcdef.txt;.sysa" und suche nach "*.txt*;.sys" so wird mir true zurück gegeben weil "*.txt*" im Dateinamen vorkommt. Das True ist allerdings falsch weil ich ja nur True zurück bekommen will wenn die Datei mit ";.sys" endet was aber nicht der fall ist. (Könnnt mich immer noch drüber aufregen das windows für sowas einen zeischen nimmt welches im Dateinamen zugelassen ist. Zusammengefasst: Folgender aufruf liefert True zurück obwohl er eigentlich false liefern müsste wenn ich ";" nicht als Delimiter verwenden will.
Delphi-Quellcode:
@mirage228: Dein Import war fast richtig. Wie bei fast allen Funktionen gibt es aber eine Ascii-Variante und vermutlichd ann auch noch eine Widestring variante - also muss der import so aussehen damit es funktioniert
PathMatchSpecA('abcdef.txt;.sysa', '*.txt*;.sys')
Delphi-Quellcode:
function PathMatchSpecA(AFilename: PChar; AMask: PChar): Boolean; stdcall external 'shlwapi.dll';
|
Re: Neue Version von FindAllFiles
Zitat:
Schau Dir mal den letzten Abschnitt mit name 'PathMatchSpecA' an ;) Abgeshen davon hast Du natürlich bezüglich des Delimiters recht. Aber wenn Du die Funktion nur intern im Programm brauchst, um z.B. irgendwelche Erweiterungs-DLLs zu suchen, geht das natürlich auch. mfG mirage228 |
Re: Neue Version von FindAllFiles
uj, du hast recht, da hab ich mal wieder nicht richtig hingeschaut wie schon so oft bei Dingen aus diesem Thread... Aber schön zu wissen das es von der Api-Seite her da eine Funktion gibt die man für andere Sachen verwenden kann wo der Delimiter nicht so wichtig ist. (Wenn die Begrenzung auf MaxPath nicht wäre und auch der Delimiter nicht könnte man die Funktion noch supi für normale Texte verwenden, aber leider ist dem ja nicht so)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:20 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