2009-06-09 12 views

Respuesta

35
string path = Path.GetFullPath("C:\\foo\\..\\bar"); // path = "C:\\bar" 

More Info

2

creo que lo que estás buscando es Syetem.IO.Path, ya que proporciona los métodos para hacer frente a varias cuestiones relativas a caminos genéricos, incluso rutas de Internet.

0

No es una respuesta directa, pero de la pregunta sospecho que está tratando de reinventar el método System.IO.Path.Combine(). Eso debería eliminar la necesidad de crear rutas como la que está preguntando en general.

+2

Path.Combine no resuelve "...", simplemente concatena dos rutas usando un único separador de ruta (dependiendo de la plataforma). –

2

Try System.IO.Path.GetFullPath (@ "c: \ foo .. \ bar")

5

¿Usted ha intentado

string path = Path.GetFullPath(@"C:\foo\..\bar"); 

en C# utilizando la clase System.IO.Path?

0

En caso de que desee hacerlo usted mismo, usted puede utilizar este código:

var normalizePathRegex = new Regex(@"\[^\]+\.."); 
var path = @"C:\lorem\..\ipsum" 
var result = normalizePathRegex.Replace(unnormalizedPath, x => string.Empty); 

URL y caminos de estilo UNIX:

var normalizePathRegex = new Regex(@"/[^/]+/.."); 
var path = @"/lorem/../ipsum" 
var result = normalizePathRegex.Replace(unnormalizedPath, x => string.Empty); 

Nota: Recuerde use RegexOptions.Compiled al utilizar este código en una aplicación real

1

Yo quería preservar el camino de relativo sin convertirlos en ruta absoluta, también quería apoyar a ambos - ventanas y saltos de línea de estilo Linux (\ o /) - así que he se le ocurrió siguiente fórmula aplicación & prueba:

using System; 
using System.Diagnostics; 
using System.Text.RegularExpressions; 

class Script 
{ 
    /// <summary> 
    /// Simplifies path, by removed upper folder references "folder\.." will be converted 
    /// </summary> 
    /// <param name="path">Path to simplify</param> 
    /// <returns>Related path</returns> 
    static String PathSimplify(String path) 
    { 
     while (true) 
     { 
      String newPath = new Regex(@"[^\\/]+(?<!\.\.)[\\/]\.\.[\\/]").Replace(path, ""); 
      if (newPath == path) break; 
      path = newPath; 
     } 
     return path; 
    } 


    [STAThread] 
    static public void Main(string[] args) 
    { 
     Debug.Assert(PathSimplify("x/x/../../xx/bbb") == "xx/bbb"); 
     // Not a valid path reference, don't do anything. 
     Debug.Assert(PathSimplify(@"C:\X\\..\y") == @"C:\X\\..\y"); 
     Debug.Assert(PathSimplify(@"C:\X\..\yy") == @"C:\yy"); 
     Debug.Assert(PathSimplify(@"C:\X\..\y") == @"C:\y"); 
     Debug.Assert(PathSimplify(@"c:\somefolder\") == @"c:\somefolder\"); 
     Debug.Assert(PathSimplify(@"c:\somefolder\..\otherfolder") == @"c:\otherfolder"); 
     Debug.Assert(PathSimplify("aaa/bbb") == "aaa/bbb"); 
    } 
} 

Eliminar referencias de carpetas superiores adicionales si alguna

+0

Como regla general: con cada expresión regular que introduzca, introduce otro problema. Esta regla se aplica aquí: 'C: \ X \\ .. \ y -> .. \ y',' C: \ X \ Y \ Z \\\ .. \ y -> C: \ X \\ .. \ y'. –

+0

Ah, mi error. ''. coincide con cualquier personaje, mientras que realmente quise decir punto. Así que el punto debe ser escapado. Solucionado en la respuesta anterior. Pero para su caso, la ruta no será modificada, porque hay doble barra antes de puntos. "\\ ..". Desde mi perspectiva, no es una ruta válida y mejor mantenerla como estaba. – TarmoPikaro

+0

Pero mis ejemplos demuestran que las rutas _han cambiado_. Y las barras invertidas dobles son, hasta donde sé, válidas por definición. –

Cuestiones relacionadas