2009-03-22 6 views
73

Próbuję dołączyć ścieżkę do systemu Windows ze ścieżką względną, używając Path.Combine.Ścieżka bezwzględna w ścieżce względnej ze ścieżkami względnymi

Jednak zwraca C:\blah\..\bling zamiast C:\bling\.

Czy ktoś wie, jak to zrobić bez pisania własnego algorytmu ścieżki względnej (która nie powinna być zbyt trudna)?

+1

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

+5

Dostajemy różne odpowiedzi tutaj .. Nie sądzę, że to duplikat – CVertex

+0

to duplikat, chociaż Myślę, że Path.GetFullName jest lepszym rozwiązaniem. –

Odpowiedz

14
 

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

Uwaga: powinien wyniknąć w 'c: \ windows \ system32' – cod3monk3y

50

Co działa:

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

(wynik: absolutePath = "C: \ bling.txt")

Co nie działa

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

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

+0

Powinieneś używać klasy Ścieżka, a nie Url ... –

+8

Tak, właśnie to insynuuję ze stanowiskiem – Llyle

+7

Upewnij się tylko, że baseDirectory ma końcowe \\, w przeciwnym razie skończysz z 'C: \\ blah .. \ \ bling.txt' i to nie działa. W takim przypadku możesz ręcznie dodać je do łańcucha lub zrobić ścieżkę 'Path.GetFullPath (Path.Combine (baseDirectory, relativePath))' –

3

to daje dokładnie to, czego potrzebujesz (ścieżka nie mają istnieć dla tej pracy)

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

Zarówno Path.GetFullPath(), jak i DirectoryInfo.FullName będą działać na fikcyjnej ścieżce. Problem polega na tym, że plik faktycznie istnieje, proces wykonywania wymaga FileIOPermission - true dla obu interfejsów API. (zobacz MSDN) –

2

uniwersalnych aplikacji dla Windows Path.GetFullPath() nie jest dostępny, można użyć klasy System.Uri zamiast:

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