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.

Nincsenek megjegyzések:

Megjegyzés küldése