(* Here are three functions that I wrote to detect directories. The first one uses findfirst, the second uses chdir and the third uses getfattr. According to my benchmarkings the third one is the fastest (and the one I preffer) . All of them need the DOS unit and will do the job as requested, however, they are not exactly equivalent: The first function will return false for d:= ':\', '\' or '..\'. They all return true if the drive has been SUBSTituted. Here are the results with some extreme strings (T = true, F = false)... Function ---> 1 2 3 ----------------------------------- d:= '' F F F d:= '.' T T T d:= '..' F T T (*) d:= '.\' F F (@) T d:= '..\' F T T (*) d:= '\' F T T d:= '/' F T (#) F d:= 'c:\' F T T d:= 'c:\.' F T T (*) while logged in a non-root directory. (@) chdir('.\') is not recognized as a valid change! (#) chdir('/') switches to the root! In all other situations the three functions return the same result. ---------------[cut]----------------------------------------------- function direxist1(d:pathstr): boolean; var dirinfo: searchrec; len : byte; begin len:= length(d); if (d[len] = '\') and {if d has a trailing slash and is... } (len > 3) then {other than ":\", "..\"... } dec(d[0]); {remove the trailing slash. } findfirst(d,directory,dirinfo);{call findfirst. } direxist1:= doserror = 0; {report boolean result } end; function direxist2(d:pathstr) : boolean; var curdir: pathstr; exist : boolean; len : byte; begin len:= length(d); if (d[len] = '\') and {if d has a trailing slash and is... } (len > 3) then {other than ":\" or "..\"... } dec(d[0]); {remove the trailing slash. } getdir(0,curdir); {get current dir } {$I-} chdir(d); {$I+} {attempt changing directory } exist := IOResult = 0; {test IOResult } if exist then chdir(curdir); {if exist then go back to current dir } direxist2:= (d <> '') and exist; end; function direxist3(d: pathstr): boolean; var f : file; attr: word; len : byte; begin len:= length(d); if (d[len] = '\') then {if d has a trailing slash... } dec(d[0]); {remove the trailing slash. } d:= d + '\.'; {add '\.' to d } assign(f,d); {assign d to f } getfattr(f,attr); {get the attribute word } direxist3 := ((attr and directory)=directory); {return true if attr is directory } end;