Как получить короткий путь файла если есть длинный и на оборот? |
Previous Top Next |
Code: |
// Короткий GetShortPathName(LongPath)
// Наоборот длинный GetFullPathName(ShortPath) |
©Drkb::03163
Code: |
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
©Drkb::03164