{
SEAN PALMER

I just ran some timings, which are gonna be affected by SMARTDRV.EXE
being loaded, but I took that into account (ran multiple times on same
file, and took timings on second/subsequent runs, to make sure always
got cache hits)

What I got was that FileExists below and my modified version of that
fileExist3 function that's been floating around this echo for a while
(no bug) both run neck and neck... it's amazing... both are slightly
faster than FileExist2 and lots lots faster than the 'reset,
fileExist=(ioresult=0)' type thing that most people still seem to use...

I'd recommend using the first one below as it's really short...
}

uses
  dos;

{ Tied for fastest }
function fileExists(var s : string) : boolean;
begin
  fileExists := fSearch(s, '') <> '';
end;

{ 2nd }
function fileExist2(var s : string) : boolean;
var
  r : searchrec;
begin
  findfirst(s, anyfile, r);
  fileExist2 := (dosError = 0);
end;

{ Tied for fastest }
function fileExist3(var s : string) : boolean; assembler;
asm
  push ds
  lds  si, s        { need to make ASCIIZ }
  cld
  lodsb             { get length; si now points to first char }
  xor  ah, ah
  mov  bx, ax
  mov  al, [si+bx]  { save byte before placing terminating null }
  push ax
  mov  byte ptr [si+bx],0
  mov  dx, si
  mov  ax, $4300    { get file attributes }
  int  $21
  mov  al, 1        { if carry set, fail }
  pop  dx
  mov  [si+bx], dl  { restore byte }
  pop  ds
end;

{ Slowest }
function fileExist4(var s : string) : boolean;
var
  f : file;
begin
  assign(f,s);
  {$I-}
  reset(f);
  {$I+}
  if ioresult = 0 then
  begin
    close(f);
    fileExist4 := true;
  end
  else
    fileExist4 := false;
end;

