function ShortToLongFilePath(const FilePath: string): string;
 
var
 
  PrevPath: string;         // path before last file/dir in FilePath
 
  ExpandedName: string;     // long form of file name
 
  SR: SysUtils.TSearchRec;  // record used by file find functions
 
  Success: Integer;         // indicates success in finding a file
 
  // ---------------------------------------------------------------------------
 
  function CountPathDelims(const Name: string): Integer;
 
    {Counts path separators in given name}
 
  var
 
    Idx: Integer; // loops thru name string
 
  begin
 
    Result := 0;
 
    for Idx := 1 to Length(Name) do
 
      if SysUtils.IsPathDelimiter(Name, Idx) then
 
        Inc(Result);
 
  end;
 
 
 
  function IsServerName(const Name: string): Boolean;
 
    {Returns true if Names is in form \\Server\Share}
 
  begin
 
    Result := (SysUtils.AnsiPos('\\', Name) = 1)
 
      and (CountPathDelims(Name) = 3);
 
  end;
 
  // ---------------------------------------------------------------------------
 
begin
 
  // Check if we have a drive, server/share or root path, and exit if so
 
  // (we can't apply file search to any of these, so we return them unchanged
 
  if (FilePath = '')
 
    or (FilePath = '\')
 
    or ((Length(FilePath) = 2) and (FilePath[2] = ':'))
 
    or ((Length(FilePath) = 3) and (FilePath[2] = ':') and (FilePath[3] = '\'))
 
    or IsServerName(FilePath) then
 
  begin
 
    Result := FilePath;
 
    Exit;
 
  end;
 
  // Do a file search on file: this is used to expand name
 
  Success := SysUtils.FindFirst(FilePath, SysUtils.faAnyFile, SR);
 
  try
 
    if Success = 0 then
 
      ExpandedName := SR.FindData.cFileName
 
    else
 
      ExpandedName := '';
 
  finally
 
    SysUtils.FindClose(SR);
 
  end;
 
  // Check if there's any part of path we've not handled, and convert it if so
 
  PrevPath := SysUtils.ExtractFileDir(FilePath);
 
  if PrevPath <> '' then
 
  begin
 
    // We have unprocessed part of path: expand that
 
    Result := ShortToLongFilePath(PrevPath);
 
    // Appended currently expanded name to path
 
    if (Result <> '') and (Result[Length(Result)] <> '\') then
 
      Result := Result + '\';
 
    Result := Result + ExpandedName;
 
  end
 
  else
 
    // No earlier parts of path: just record expanded name
 
    Result := ExpandedName;
 
end;
 
//delphi/2223