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;
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;
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;