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

Материал из DRKB

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

// Короткий
GetShortPathName(LongPath)

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


ID: 03163



// Возвращает LongFileName преобразованное в соответствующее короткое имя
function sfn(const LongName: string): string;
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;

// Возвращает FileName преобразованное в соответствующее длинное имя
function ShortToLongFileName(FileName: string): string;
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;


Author: Автор: Alex&Co
Source: http://alex-co.com.ru
ID: 03164