Laden...

Arbeiten mit relativen Pfaden

Erstellt von alias5000 vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.255 Views
A
alias5000 Themenstarter:in
31 Beiträge seit 2007
vor 15 Jahren
Arbeiten mit relativen Pfaden

Hallo!
Ich suche möglichst eine API-Lösung für den Umgang mit relativen Pfaden. Ich möchte es vermeiden, mir eine eigene Lösung basteln zu müssen.

Ich möchte aus einem relativen Pfad zu einem anderen gegebenen Pfad einen absoluten Pfad machen.

Dabei ist die einfache Variante folgendes:

Pfad: C:\Test Relativer Teil: Test.xml Ergebnis: C:\Test\test.xml

Interessanter wird es aber bei:

Pfad: C.\Test Relativer Teil: ..\Test.xml Ergebnis: C:\Test.xml

Und die Krönung dazu ist:

Pfad: C:\Test Relativer Teil: ..\Files\Test.xml Ergebnis: C:\Files\test.xml

Gibt es hierfür irgendwas in der .NET API oder ist euch was anderes bekannt?
Die Suchfunktion hat dazu leider keine zufriedenstellende Lösung geliefert 🙁

Viele Grüße
alias5000

Linux is like a tipi: no gates, no windows and apache inside.

4.207 Beiträge seit 2003
vor 15 Jahren

Path.Combine

Wissensvermittler und Technologieberater
für .NET, Codequalität und agile Methoden

www.goloroden.de
www.des-eisbaeren-blog.de

A
alias5000 Themenstarter:in
31 Beiträge seit 2007
vor 15 Jahren

Das dachte ich auch, aber ich habe da mal die Mehode mit Variante 2 gefüttert und bekam nichts anderes, wie, wenn ich die Strings einfach aneinanderhängen würde (s1+s2).

Aufrug war in etwa so:

Path.Combine("C:\\Test", "..\\Test.ini");

Ergebnis:
C:\Test..\Test.ini

Gruß
alias5000

Linux is like a tipi: no gates, no windows and apache inside.

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo alias5000,

Path.GetFullPath (Path.Combine("C:\\Test", "..\\Test.ini"))

herbivore

A
alias5000 Themenstarter:in
31 Beiträge seit 2007
vor 15 Jahren

Vielen Dank!

Gibt es für die umgekehrte Richtung auch was in der .NET-Kruschtelkiste?
Also von einem Absoluten Pfad zu einem relativen im Verhältnis zu einem anderen gegebenen Pfad

Linux is like a tipi: no gates, no windows and apache inside.

49.485 Beiträge seit 2005
vor 15 Jahren

Hallo alias5000,

eine fertige Methode gibt es da vermutlich nicht, aber mit dem Methoden der Path-Klasse solltest du das hinbekommen.

herbivore

T
708 Beiträge seit 2008
vor 15 Jahren

Hi zusammen,
hätte da evtl. was anzubieten:


string directory = Application.StartupPath;;

private string RelativePath(string relativeTo)
        { 
            string absolutePath = directory;
            string[] absoluteDirectories = absolutePath.Split('\\');
            string[] relativeDirectories = relativeTo.Split('\\');
            
            int length = absoluteDirectories.Length < relativeDirectories.Length ? absoluteDirectories.Length : relativeDirectories.Length;
            int lastCommonRoot = -1;
            int index;

            for (index = 0; index < length; index++)
                if (absoluteDirectories[index] == relativeDirectories[index])
                    lastCommonRoot = index;
                else
                    break;

            if (lastCommonRoot == -1)
            {
            	MessageBox.Show("Das Programm befindet sich nicht auf dem selben Datenträger!\" + Path.GetPathRoot(absolutePath)+" & "+Path.GetPathRoot(relativeTo));
            	return relativeTo.ToString();
            }
			else
			{            
            StringBuilder relativePath = new StringBuilder();

            for (index = lastCommonRoot + 1; index < absoluteDirectories.Length; index++)
                if (absoluteDirectories[index].Length > 0)
                    relativePath.Append("..\\");
            
            for (index = lastCommonRoot + 1; index < relativeDirectories.Length - 1; index++)
                relativePath.Append(relativeDirectories[index] + "\\");
            relativePath.Append(relativeDirectories[relativeDirectories.Length - 1]);
         
              return relativePath.ToString();            
			}
        }

Bestimmt nicht der einfachste Weg, aber vielleicht hilft es ja ein bisschen.

EDIT:
@Golo Roden, stimmt habe die Diskussion darüber mal gelesen. thx

4.207 Beiträge seit 2003
vor 15 Jahren

\ solltest Du eventuell durch den PathSeparatorChar ersetzen 😉

Wissensvermittler und Technologieberater
für .NET, Codequalität und agile Methoden

www.goloroden.de
www.des-eisbaeren-blog.de

A
alias5000 Themenstarter:in
31 Beiträge seit 2007
vor 15 Jahren

eine ähnliche Methode hatte ich aber nichtswissen heute vormittag schon selbst geschrieben.

Trotzdem danke 🙂!

Linux is like a tipi: no gates, no windows and apache inside.