--- ---

Here's a way to convert between short 8.3 DOS file names and long file names.

First function will convert long file names to the 8.3 format:

    uses
      Windows, SysUtils;

    function GetShortName(sLongName: string): string;
    var
      sShortName    : string;
      nShortNameLen : integer;
    begin
      SetLength(sShortName, MAX_PATH);
      nShortNameLen := GetShortPathName(
        PChar(sLongName), PChar(sShortName), MAX_PATH - 1
      );
      if (0 = nShortNameLen) then
      begin
        // handle errors...
      end;
      SetLength(sShortName, nShortNameLen);
      Result := sShortName;
    end;

Now a function to convert a short file name into a long file name:

    uses
      Windows, SysUtils;

    function __GetLongName(sShortName: string; var bError : boolean): string;
    var
      bAddSlash : boolean;
      SearchRec : TSearchRec;
      nStrLen   : integer;
    begin
      bError    := False;
      Result    := sShortName;
      nStrLen   := Length(sShortName);
      bAddSlash := False;

      if('\' = sShortName[nStrLen]) then
      begin
        bAddSlash := True;
        SetLength(sShortName, nStrLen - 1);
        dec(nStrLen);
      end;

      if (nStrLen - Length(ExtractFileDrive(sShortName))) > 0 then
      begin
        if 0 = FindFirst(sShortName, faAnyFile, SearchRec) then
        begin
          Result := ExtractFilePath(sShortName) + SearchRec.Name;
          if bAddSlash then
          begin
            Result := Result + '\';
          end;
        end
        else
        begin
          // handle errors...
          bError := True;
        end;
        FindClose(SearchRec);
      end;
    end;

    function GetLongName(sShortName: string): string;
    var
      s      : string;
      p      : integer;
      bError : boolean;
    begin
      Result := sShortName;

      s := '';
      p := Pos('\', sShortName);
      while p > 0 do
      begin
        s := __GetLongName(s + Copy(sShortName, 1, p), bError);
        Delete(sShortName, 1, p);
        p := Pos('\', sShortName);

        if bError then
          Exit;
      end;
      if '' <> sShortName then
      begin
        s := __GetLongName(s + sShortName, bError);
        if bError then
          Exit;
      end;
      Result := s;
    end;

Let's give our functions a try:

    procedure Test;
    const
      csTest = 'C:\Program Files';
    var
      sShort,
      sLong: string;
    begin
      sShort := GetShortName(csTest);
      MessageDlg(
        'Short name for "' + csTest + '" is "' + sShort + '"',
        mtInformation, [mbOk], 0
      );
      sLong := GetLongName(sShort);
      MessageDlg(
        'Long name for "' + sShort + '" is "' + sLong + '"',
         mtInformation, [mbOk], 0
      );
    end;

See also the LongToShortFilePath & ShortToLongFilePath routines in the DelphiDabbler Code Snippets Database.