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

    (*
    In an earlier release of SWAG Andrew Eigus provided code for a fast
    'FileExist' function.

    The function however has a potential bug in that the filename passed
    into the function must be ASCIIZ (null terminated) to work correctly.
    It will also return a TRUE result for a directory name or the volume ID.

    My 'EntryExists' function below includes the extra code to convert the
    filename to ASCIIZ and has been optimised for speed slightly by replacing
    the Jump instruction.

    My 'FileExists' function below is an extended version which returns TRUE
    for files only (not a directory entry or volume ID).

    *)

    FUNCTION EntryExists(FileName : String) : Boolean; ASSEMBLER;
    ASM
      PUSH DS          {Save DS                         }
      LDS  SI,Filename {DS:SI => Filename               }
      XOR  BX,BX       {Clear BX                        }
      MOV  BL,[SI]     {BX = Length(Filename)           }
      INC  SI          {DS:SI => Filename[1]            }
      MOV  DX,SI       {DS:DX => Filename[1]            }
      MOV  [SI+BX],BH  {Append Ascii 0 to Filename      }
      MOV  AX,4300h    {Get Attribute Function Code     }
      INT  21h         {Get File Attributes             }
      MOV  AL,BH       {Set Default Result to FALSE     }
      CMC              {Toggle Carry Flag               }
      ADC  AL,AL       {Change Result to TRUE if Failed }
      POP  DS          {Restore DS                      }
    END; {EntryExists}

    FUNCTION FileExists(FileName : String) : Boolean; ASSEMBLER;
    ASM
      PUSH DS          {Save DS                         }
      LDS  SI,Filename {DS:SI => Filename               }
      XOR  BX,BX       {Clear BX                        }
      MOV  BL,[SI]     {BX = Length(Filename)           }
      INC  SI          {DS:SI => Filename[1]            }
      MOV  DX,SI       {DS:DX => Filename[1]            }
      MOV  [SI+BX],BH  {Append Ascii 0 to Filename      }
      MOV  AX,4300h    {Get Attribute Function Code     }
      INT  21h         {Get File Attributes             }
      MOV  AL,BH       {Default Result = FALSE          }
      ADC  CL,CL       {Attribute * 2 + Carry Flag      }
      AND  CL,31h      {Directory or VolumeID or Failed }
      JNZ  @@Done      {Yes - Exit                      }
      INC  AL          {No - Change Result to TRUE      }
    @@Done:
      POP  DS          {Restore DS                      }
    END; {FileExists}

    CONST
      Found : ARRAY[Boolean] OF String[10] = ('Not Found', 'Found');
    VAR
      FileName : String;

    BEGIN
      Write('Enter file name to search: ');
      ReadLn(FileName);
      WriteLn('File "', FileName, '" ', Found[EntryExists(FileName)], '.');
    END.

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