Ne, soviele Unterordner habe ich noch nicht getestet, hier zwei Funktionen um aus nem legitimen 8.3 wieder was langes zurück zu erhalten, ohne FindFirst() aufzurufen.
uses Windows, SysUtils, ActiveX, ShlObj;
Was zuviel ist, wirf raus.
Passend zum ersten PIDL Beispiel, hier ein weiteres
Delphi-Quellcode:
function LongPathFromShort(const ShortPath: string): string;
var
iAttributes: Cardinal;
iEaten: Cardinal;
IntfDesktop: IShellFolder;
IntfMalloc: IMalloc;
pItemList: PItemIDList;
sFile: WideString;
szFile: array[0..MAX_PATH] of Char;
begin
Result := ShortPath;
if not FileExists(ShortPath) then
Exit;
if Succeeded(SHGetDesktopFolder(IntfDesktop)) then
begin
sFile := ShortPath;
iAttributes := 0;
if Succeeded(IntfDesktop.ParseDisplayName(0, nil, POleStr(sFile),
iEaten, pItemList, iAttributes)) then
begin
SHGetPathFromIDList(pItemList, szFile);
Result := szFile;
SHGetMalloc(IntfMalloc);
IntfMalloc.Free(pItemList)
end
end
end;
Oder lieber per
WinApi:
Delphi-Quellcode:
function GetLongName(const APath: string): string;
var
Buffer: array[0..MAX_PATH] of Char;
Required: Integer;
begin
Required := GetLongPathName(PChar(APath), Buffer, Length(Buffer));
if Required > MAX_PATH then {Buffer too small}
begin
SetLength(Result, Required - 1);
GetLongPathName(PChar(APath), Pointer(Result), Required);
end
else if Required = 0 then {Error}
Result := APath
else
SetString(Result, Buffer, Required);
end;
Ich habe es nicht mit extrem langen/tiefen Ordner-Namen getestet, bei mir machts jedenfalls das was es soll, 8.3 entfalten.