[Back to FILES SWAG index] [Back to Main SWAG index] [Original]

    {
    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;

[Back to FILES SWAG index] [Back to Main SWAG index] [Original]