Как получить короткий путь файла, если есть длинный, и на оборот?
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;
Сайт: https://alex-co.com.ru