2010-06-29 29 views
30

estoy usando Path.Combine así:¿Cómo obtengo .NET's Path.Combine para convertir las barras diagonales en barras diagonales inversas?

Path.Combine("test1/test2", "test3\\test4"); 

La salida que recibo es:

test1/test2\test3\test4 

Note como la barra diagonal no quede convertida en una barra invertida. Sé que puedo hacer cadenas. Reemplazar para cambiarlo, pero ¿hay una mejor manera de hacerlo?

+3

¿La barra diagonal inversa es un problema? Las API de archivo .NET y Windows aceptan cualquiera. –

+0

¿Cuál es el problema con las barras mezcladas? ¿Vanidad? – JBRWilkinson

+4

@John, sí, hay: http://msdn.microsoft.com/en-us/library/system.io.path.combine.aspx. ¿O estabas tratando de ser pedante sobre la diferencia entre C# y .NET? –

Respuesta

18

Debido a que su "test1/test2" ya es una cadena literal, Path.Combine no cambiará la '/' por una '\'.

Path.Combine sólo se concat las 2 cadenas literales con el delimitador de ruta adecuada utilizado por el sistema operativo, en este caso de Windows, que es '\', de allí su salida

test1/test2\test3\test4 

Su mejor apuesta sería se la cadena. Reemplazar

+22

Gracias. Alternativamente, descubrí que 'Path.GetFullPath()' también reemplazará barras con barras invertidas. –

+0

Genial, no lo sabía, pero seguro que lo anotaré. – Riaan

+3

Después de la combinación, probablemente podría reemplazar TODOS los tipos de barras con 'Path.DirectorySeparatorChar'. –

11

Pruebe usar la clase Uri. Creará Uris válido para la máquina de destino correcta (/ ->\).

+0

Bueno, esto funciona. Solo necesita crear 'nuevo Uri (ruta)' y automáticamente se convierte en barras invertidas. Niza – Edgar

+0

Esto funciona: 'new Uri (@" c:/temp \ test/"). LocalPath' –

2

En primer lugar, yo diría que en este caso particular, no sería razonable hacer una sola .Colocar()

En segundo lugar, también se puede utilizar para dar formato a System.Uri su camino, es muy estricta. Sin embargo, serán más líneas que un simple .Replace(). Aparentemente estoy votando por usted para que simplemente use .Replace() ¡termine con eso! Espero que ayude

1

El uso del reflector .NET, se puede ver que Path.Combine no cambia barras en las cadenas proporcionadas

public static string Combine(string path1, string path2) 
{ 
    if ((path1 == null) || (path2 == null)) 
    { 
     throw new ArgumentNullException((path1 == null) ? "path1" : "path2"); 
    } 
    CheckInvalidPathChars(path1); 
    CheckInvalidPathChars(path2); 
    if (path2.Length == 0) 
    { 
     return path1; 
    } 
    if (path1.Length == 0) 
    { 
     return path2; 
    } 
    if (IsPathRooted(path2)) 
    { 
     return path2; 
    } 
    char ch = path1[path1.Length - 1]; 
    if (((ch != DirectorySeparatorChar) && (ch != AltDirectorySeparatorChar)) && (ch != VolumeSeparatorChar)) 
    { 
     return (path1 + DirectorySeparatorChar + path2); 
    } 
    return (path1 + path2); 
} 

Puede hacer lo mismo con String.Replace y los métodos de la clase URI para determinar cuál de ellas funciona mejor para ti

+0

Tenga en cuenta que 'DirectorySeparatorChar = '\\'' y 'AltDirectorySeparatorChar = '/'' – Greg

65

Como han dicho otros, Path.Combine no cambia el separador. Sin embargo, si se lo convierte a una ruta completa:

Path.GetFullPath(Path.Combine("test1/test2", "test3\\test4")) 

la ruta completa resultante usará el separador de directorios estándar (barra invertida para Windows).

+1

funciona pero tenga cuidado ya que GetFullPath() arreglará las rutas relativas y las convertirá en rutas completas. Si necesita conservar una ruta relativa, GetFullPath() no funcionará. –

+0

No funciona, las rutas no cambian (mono) – George

+0

@George, ¿está seguro: mono en qué sistema operativo? ¿Cuál es el separador de ruta estándar para su versión de mono (Path.DirectorySeparatorChar)? – Joe

Cuestiones relacionadas