2009-03-22 15 views
73

Ich versuche, einen Windows-Pfad mit einem relativen Pfad mithilfe von Path.Combine beizutreten.Path.Combine absolute mit relativen Pfadzeichenfolgen

Path.Combine(@"C:\blah",@"..\bling") gibt jedoch C:\blah\..\bling statt C:\bling\ zurück.

Kann jemand das erreichen, ohne meinen eigenen relativen Pfadresolver zu schreiben (was nicht zu schwer sein sollte)?

+1

Duplizieren: http://stackoverflow.com/questions/623333/pathcanonicalize-equivalent-in-c –

+5

Wir bekommen hier unterschiedliche Antworten .. Ich glaube nicht, es ist ein Duplikat – CVertex

+0

es ist doppelt, obwohl Ich denke, Path.GetFullName ist eine bessere Lösung. –

Antwort

14
 

Path.GetFullPath(@"c:\windows\temp\..\system32")? 
 
+1

Hinweis: sollte in 'c: \ windows \ resultieren system32' – cod3monk3y

50

Was funktioniert:

string relativePath = "..\\bling.txt"; 
string baseDirectory = "C:\\blah\\"; 
string absolutePath = Path.GetFullPath(baseDirectory + relativePath); 

(Ergebnis: AbsolutePath = "C: \ bling.txt")

Was nicht funktioniert

string relativePath = "..\\bling.txt"; 
Uri baseAbsoluteUri = new Uri("C:\\blah\\"); 
string absolutePath = new Uri(baseAbsoluteUri, relativePath).AbsolutePath; 

(Ergebnis: absolutePath = "C: /blah/bling.txt")

+0

Sie sollten die Path-Klasse, nicht URL verwenden ... –

+8

Ja, das ist, was ich mit der Post Insiuuating – Llyle

+7

Stellen Sie einfach sicher, dass baseDirectory hat die abschließende \\, sonst Sie am Ende mit C: \\ blah .. \\ bling.txt' und das geht nicht. In diesem Fall können Sie sie manuell zum String hinzufügen oder 'Path.GetFullPath (Path.Combine (baseDirectory, relativePath))' ' –

3

Dies wird Ihnen genau das, was Sie brauchen (Pfad muss nicht hierfür zu existieren arbeiten)

DirectoryInfo di = new DirectoryInfo(@"C:\blah\..\bling"); 
string cleanPath = di.FullName; 
+1

Sowohl Path.GetFullPath() als auch DirectoryInfo.FullName funktionieren auf einem fiktiven Pfad. Das Problem ist, wenn die Datei tatsächlich existiert, der ausführende Prozess benötigt FileIOPermission - true für beide APIs. (siehe MSDN) –

2

für Fenster universal-Apps Path.GetFullPath() nicht verfügbar ist, können Sie die System.Uri Klasse verwenden statt:

Uri uri = new Uri(Path.Combine(@"C:\blah\",@"..\bling")); 
Console.WriteLine(uri.LocalPath); 
Verwandte Themen