C# – relativen Pfad in absoluten Pfad umwandeln

Veröffentlicht von

Wie kann ich einen relativen Pfad in einen absoluten Pfad umwandeln?

Vor kurzem hatte ich das Problem, dass ich einen relativen Pfad in einen absoluten Pfad umwandeln musste. Hierbei habe ich auf Stackoverflow einen sehr guten Tipp bekommen.

Funktionen

Die Lösung besteht aus zwei überladenen Funktionen:

public static String GetAbsolutePath(String path)
{
    return GetAbsolutePath(null, path);
}

public static String GetAbsolutePath(String basePath, String path)
{
    if (path == null)
        return null;
    if (basePath == null)
        basePath = Path.GetFullPath("."); // quick way of getting current working directory
    else
        basePath = GetAbsolutePath(null, basePath); // to be REALLY sure ;)
    String finalPath;
    // specific for windows paths starting on \ - they need the drive added to them.
    // I constructed this piece like this for possible Mono support.
    if (!Path.IsPathRooted(path) || "\\".Equals(Path.GetPathRoot(path)))
    {
        if (path.StartsWith(Path.DirectorySeparatorChar.ToString()))
            finalPath = Path.Combine(Path.GetPathRoot(basePath), path.TrimStart(Path.DirectorySeparatorChar));
        else
            finalPath = Path.Combine(basePath, path);
    }
    else
        finalPath = path;
    // resolves any internal "..\" to get the true full path.
    return Path.GetFullPath(finalPath);
}

Die erste Funktion übernimmt den relativen Pfad und gibt den absoluten zurück. Dies geschieht auf Basis des aktuellen Arbeitsverzeichnisses.

Dies ist nicht immer das, was man will. Die zweite Funktion übernimmt einen absoluten Pfad, welcher anschließend als Basis für den relativen Pfad hergenommen wird.

Beispiele

Hier ein paar Beispiele in Form eines Unit-Tests:

var absPath = "c:\\temp\\out\\bin";
var path1 = "..\\relative\\path";
var result1 = Utils.GetAbsolutePath(absPath, path1);
Assert.IsTrue(result1 == "c:\\temp\\out\\relative\\path");

var path2 = "\\..\\relative\\path";
var result2 = Utils.GetAbsolutePath(absPath, path2);
Assert.IsTrue(result2 == "c:\\relative\\path");

var path3 = "..\\..\\relative\\path";
var result3 = Utils.GetAbsolutePath(absPath, path3);
Assert.IsTrue(result3 == "c:\\temp\\relative\\path");

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert