Das gibt es alles schon fertig. Insbesondere werden die .. Stellen ja vermutlich durch eine Kombination zweier Pfade kommen. Das geht jedenfalls in beiden Fällen direkt über die
API:
Delphi-Quellcode:
function PathCombine(lpszDest: PChar; const lpszDir, lpszFile: PChar): PChar; stdcall; external 'shlwapi.dll' name 'PathCombineW';
function PathCombineA(lpszDest: PAnsiChar; const lpszDir, lpszFile: PAnsiChar): PAnsiChar; stdcall; external 'shlwapi.dll';
function PathCombineW(lpszDest: PWideChar; const lpszDir, lpszFile: PWideChar): PWideChar; stdcall; external 'shlwapi.dll';
function GetCombinedPath(const BasePath, RelativePath: string): string;
begin
SetLength(Result, MAX_PATH);
PathCombine(PChar(Result), PChar(ExtractFilePath(BasePath)), PChar(RelativePath));
SetLength(Result, StrLen(PChar(Result)));
end;
procedure TForm140.FormCreate(Sender: TObject);
begin
ShowMessage(GetCombinedPath('c:\program files\..\test\', '')); // c:\test\
ShowMessage(GetCombinedPath('c:\program files\', '..\xyz\hallo.txt')); // c:\xyz\hallo.txt
end;
Wichtig ist, dass im ersten Pfad (ggf. mit IncludeTrailingPathDelimiter angehängt) am Ende ein \ steht, wenn das ein Ordnername ist.