2008. április 5., szombat
How to find files with wildcards
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.
Feliratkozás:
Megjegyzések küldése (Atom)
Nincsenek megjegyzések:
Megjegyzés küldése