Tuesday, March 1, 2011

Is it 'C:\Program Files' or 'C:\PROGRA~1'

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:
 
// remove following two lines
// if already included
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;
Listing #1 : Delphi code. Download longshrt (0.39 KB).
 
Now a function to convert a short file name into a long file name:
 
// remove following two lines
// if already included
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;
Listing #2 : Delphi code. Download shrtlong (0.69 KB).
 
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;
Listing #3 : Delphi code. Download test (0.33 KB).

0 comments:

Post a Comment

Twitter Delicious Facebook Digg Stumbleupon Favorites More

 
Design by Kang Iwan K-sev | Thank's for your visit To My Site - Ridwan Mulyana | Cibeureum