Einzelnen Beitrag anzeigen

Benutzerbild von KodeZwerg
KodeZwerg

Registriert seit: 1. Feb 2018
3.685 Beiträge
 
Delphi 11 Alexandria
 
#17

AW: Groß/Kleinschreibung (Pfad) Original erhalten?

  Alt 29. Sep 2018, 20:52
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.
Gruß vom KodeZwerg
  Mit Zitat antworten Zitat