Как получить короткий путь файла если есть длинный и на оборот?
Falk0ner, вс, 06/07/2008 - 15:34.
// Короткий
GetShortPathName(LongPath)
// Наоборот длинный
GetFullPathName(ShortPath)
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
{©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;
Отправить комментарий