How to find files with wildcards (Views: 28)
Problem/Question/Abstract: How can I find files using wildcards? For example: wildcards('c:\*.txt', 'c:\test.txt') = true wildcards('*.c?g', '123.cfg') = true wildcards('c*.doc', 'doc.doc') = false Answer: type PathStr = string[128]; { in Delphi 2/3: = string } NameStr = string[12]; { in Delphi 2/3: = string } ExtStr = string[3]; { in Delphi 2/3: = string } {$V-} { in Delphi 2/ 3 to switch off "strict var-strings" } function WildComp(FileWild, FileIs: PathStr): boolean; var NameW, NameI: NameStr; ExtW, ExtI: ExtStr; c: Byte; function WComp(var WildS, IstS: NameStr): boolean; var i, j, l, p: Byte; begin i := 1; j := 1; while (i <= length(WildS)) do begin if WildS[i] = '*' then begin if i = length(WildS) then begin WComp := true; exit end else begin { we need to synchronize } l := i + 1; while (l < length(WildS)) and (WildS[l + 1] <> '*') do inc(l); p := pos(copy(WildS, i + 1, l - i), IstS); if p > 0 then begin j := p - 1; end else begin WComp := false; exit; end; end; end else if (WildS[i] <> '?') and ((length(IstS) < i) or (WildS[i] <> IstS[j])) then begin WComp := false; exit end; inc(i); inc(j); end; WComp := (j > length(IstS)); end; begin c := pos('.', FileWild); if c = 0 then begin { automatically append .* } NameW := FileWild; ExtW := '*'; end else begin NameW := copy(FileWild, 1, c - 1); ExtW := copy(FileWild, c + 1, 255); end; c := pos('.', FileIs); if c = 0 then c := length(FileIs) + 1; NameI := copy(FileIs, 1, c - 1); ExtI := copy(FileIs, c + 1, 255); WildComp := WComp(NameW, NameI) and WComp(ExtW, ExtI); end; { Example } begin if WildComp('a*.bmp', 'auto.bmp') then ShowMessage('OK 1'); if not WildComp('a*x.bmp', 'auto.bmp') then ShowMessage('OK 2'); if WildComp('a*o.bmp', 'auto.bmp') then ShowMessage('OK 3'); if not WildComp('a*tu.bmp', 'auto.bmp') then ShowMessage('OK 4'); end; end. |