Как получить короткий путь файла если есть длинный и на оборот?
Материал из 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