2009-03-22 16 views
73

Estoy intentando unirme a una ruta de Windows con una ruta relativa utilizando Path.Combine.Path.Combine absolute con cadenas de ruta relativa

Sin embargo, Path.Combine(@"C:\blah",@"..\bling") devuelve C:\blah\..\bling en lugar de C:\bling\.

¿Alguien sabe cómo lograr esto sin escribir mi propia resolución de ruta relativa (que no debería ser demasiado difícil)?

+1

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

+5

Estamos recibiendo diferentes respuestas aquí .. No creo que sea un duplicado – CVertex

+0

es duplicado, aunque Creo que Path.GetFullName es una mejor solución. –

Respuesta

14
 

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

Nota: debería dar como resultado 'c: \ windows \ system32' – cod3monk3y

50

Lo que funciona:

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

(resultado: rutaAbsoluta = "C: \ bling.txt")

lo que no funciona

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

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

+0

Debería estar usando la clase Path, no Url ... –

+8

Sí, eso es lo que estoy insinuando con la publicación – Llyle

+7

Solo asegúrese de que baseDirectory tenga el \\ final, de lo contrario terminará con 'C: \\ blah .. \\ bling.txt' y eso no funciona. En ese caso, puede agregarlos manualmente a la cadena o hacer 'Path.GetFullPath (Path.Combine (baseDirectory, relativePath))' –

3

esto le dará exactamente lo que necesita (ruta NO tiene de existir para que esto funcione)

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

Tanto Path.GetFullPath() como DirectoryInfo.FullName funcionarán en una ruta ficticia. El problema es cuando el archivo realmente existe, el proceso de ejecución necesita FileIOPermission: verdadero para ambas API. (ver MSDN) –

2

para windows aplicaciones universales Path.GetFullPath() no está disponible, puede utilizar la clase System.Uri lugar:

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