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;
现在是一个将短文件名转换为长文件名的函数:
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;