Sources
Delphi Russian Knowledge Base
DRKB - это самая большая и удобная в использовании база знаний по Дельфи в рунете, составленная Виталием Невзоровым

Как получить короткий путь файла, если есть длинный, и на оборот?

01.01.2007
// Короткий
GetShortPathName(LongPath)
 
// Наоборот длинный
GetFullPathName(ShortPath)

function sfn(const LongName: String): String;
 

 
// Возвращает LongFileName преобразованное в соответствующее короткое имя
var i :Integer;
begin
 
SetLength(Result,Length(LongName));
  i
:= GetShortPathName(pChar(LongName),pChar(Result),Length(Result));
 
if  i > Length(Result)  then begin
   
SetLength(Result,i);
    i
:= GetShortPathName(pChar(LongName),pChar(Result),Length(Result));
 
end;
 
SetLength(Result,i);
end;
 
function ShortToLongFileName(FileName: string): string;
// Возвращает FileName преобразованное в соответствующее длинное имя
var
 
KernelHandle: THandle;
 
FindData: TWin32FindData;
 
Search: THandle;
 
GetLongPathName: function(lpszShortPath: PChar; lpszLongPath: PChar;
                            cchBuffer
: DWORD): DWORD; stdcall;
begin
 
KernelHandle := GetModuleHandle('KERNEL32');
 
if KernelHandle <> 0 then
   
@GetLongPathName := GetProcAddress(KernelHandle, 'GetLongPathNameA');
 
 
// Использю GetLongPathName доступную в windows 98 и выше чтобы
 
// избежать проблем доступа к путям UNC в системах NT/2K/XP
 
if Assigned(GetLongPathName) then begin
   
SetLength(Result, MAX_PATH + 1);
   
SetLength(Result, GetLongPathName(PChar(FileName), @Result[1], MAX_PATH));
 
end
 
else begin
   
Result := '';
 
   
// Поднимаюсь на одну дирректорию выше от пути к файлу и запоминаю
   
// в result.  FindFirstFile возвратит длинное имя файла полученное
   
// из короткого.
   
while (True) do begin
     
Search := Windows.FindFirstFile(PChar(FileName), FindData);
 
     
if Search = INVALID_HANDLE_VALUE then Break;
 
     
Result := String('\') + FindData.cFileName + Result;
      FileName := ExtractFileDir(FileName);
      Windows.FindClose(Search);
 
      // Нахожу имя диска с двоеточием.
      if Length(FileName) <= 2 then Break;
    end;
 
    Result := ExtractFileDrive(FileName) + Result;
  end;
end;
 

Автор: Alex&Co

Сайт: https://alex-co.com.ru