StartseiteRessourcenDelphi-TippsAbsolute und relative Pfade

Absolute und relative Pfade

Um absolute in relativen Pfadangaben zu konvertieren und umgekehrt, bietet Delphi die beiden folgenden Funktionen:
ExpandFileName(const FileName: String): String;
ExpandFileName konvertiert einen relativen Dateinamen in einen vollständigen Pfadnamen, indem dem Dateinamen das aktuelle Verzeichnis und das aktuelle Laufwerk hinzugefügt wird. Man kann aber auch einen absoluten Pfad + einen relativen Pfad als Argument übergeben. Dann wird dieser komplizierte Pfad zu einem absoluten Pfad vereinfacht. ExpandFileName prüft nicht, ob der Rückgabewert auf eine existierende Datei verweist.
ExtractRelativePath(const BaseName, DestName: String): String;
Mit ExtractRelativePath können Sie eine vollständige Pfadangabe in eine relative Pfadangabe umwandeln. Der Parameter DestName gibt den zu konvertierenden Dateinamen (einschließlich Pfad) an. BaseName ist der vollständige Pfad des Verzeichnisses, zu dem der zurückgegebene Pfadname relativ sein soll. BaseName kann einen Dateinamen, muss aber eine endgültige Pfadbegrenzung enthalten!
 

Darüberhinaus wäre noch eine Funktion sinnvoll, mit der man überprüfen kann, ob ein Pfad relativ oder absolut ist. Leider bietet Delphi dafür keine Lösung an. Jedoch ist in der "shlwapi.dll", die ab Windows 98 und 2000 von Microsoft mitgliefert wird (bzw. für 95 und NT4 muss lediglich der IE4 installiert werden), eine entsprechende Funktion enthalten. In Delphi bindet man diese Funktion wie folgt ein:

function PathIsRelative(pszPath: PAnsiChar): BOOL; stdcall; external 'shlwapi.dll' name 'PathIsRelativeA';
Der Aufruf funktioniert dann wie folgt:
if PathIsRelative(PChar('C:\Temp')) then ShowMessage('True') else  ShowMessage('False');
Leider erkennt diese Funktion URLs (http://...) immer als relative Pfade. Um URL als solche zu identifizieren gibt es in der "shlwapi.dll" eine weitere Funktion:
function PathIsURL(pszPath: PChar): BOOL; stdcall; external 'shlwapi.dll' name 'PathIsURLA';
Übrigens gibt es für Delphi-Funktion "ExpandFileName" auch ein Pedant in der "shlwapi.dll":
function PathCanonicalize(lpszDest, lpszSrc: PAnsiChar): bool; stdcall; external 'shlwapi.dll' name 'PathCanonicalizeA';
oder
function PathCombine(lpszDest: PChar; const lpszDir, lpszFile: PChar): PChar; stdcall; external 'shlwapi.dll' name 'PathCombineA';
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';
Die Aufrufe sind hier etwas komplizierter:
procedure TForm1.Button1Click(Sender: TObject);
var buf : array[0..MAX_PATH]of char;   S: String;
begin
  PathCanonicalize(buf,PChar('C:\Tools\Treiber\..\Applications\winword.exe'));
  ShowMessage(String(buf));
end;
oder
procedure TForm1.Button2Click(Sender: TObject);
var
  dest: string;
  BaseFile, RelativePath: String;
begin
  BaseFile := 'C:\folder1\folder2\folder3\';
  RelativePath := '..\..\test2.dat';
  SetLength(dest, MAX_PATH);
  PathCombine(@dest[1], PChar(ExtractFilePath(BaseFile)), PChar(RelativePath));
  SetLength(dest, StrLen(@Dest[1]));
  ShowMessage(dest);
end;
(Wer Wert auf die Unicode-Varianten der Funktionen aus der "shlwapi.dll" legt, der verwendet bei der Definition den Suffix "W" anstatt von "A", und "PWideChar" anstelle von "PAnsiChar". )
 

Weblinks:

  • http://www.delphi-library.de/viewtopic.php?t=28630&start=0&postorder=asc&sid=cc77a598208c51ab6058fc86bbf3cc72
  • oder: http://www.delphipraxis.net/topic30993.html
  • http://www.swissdelphicenter.ch/torry/showcode.php?id=1956