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

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

function sfn(const LongName: String): String;
{©Drkb v.3(2007): www.drkb.ru}
// Возвращает 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 Сайт: http://alex-co.com.ru

Отправить комментарий

Проверка
Антиспам проверка
Image CAPTCHA
...