2011-04-21 27 views
21

Para mi sorpresa, este código no produce los resultados esperados:¿Por qué Path.Combine produce este resultado con una ruta relativa?

var basePath = @"\\server\BaseFolder"; 
var relativePath = @"\My\Relative\Folder"; 

var combinedPath = Path.Combine(basePath, relativePath); 

El resultado es \My\Relative\Folder en lugar de la \\server\BaseFolder\My\Relative\Folder esperado.

¿Por qué es esto? ¿Cuál es la mejor manera de combinar rutas relativas que pueden tener o no una barra inclinada?

EDIT: Soy consciente de que yo sólo puedo hacer la manipulación de cadenas en relativePath para detectar y eliminar una barra de inicio. ¿Hay alguna manera más segura de hacer esto (pensé que se suponía que el Path.Combine era la forma segura) que explicaría las barras invertidas y las pestañas frontales?

+9

Esa no es una ruta _relativa_. – SLaks

+0

Entiendo que si hubiera 2 barras invertidas en la parte delantera, ¿sería una ruta UNC, pero una barra oblicua? ¿Seriamente? – Brandon

+5

Sí; seriamente. '\ a \ b' es una ruta ** absoluta **. (aunque es relativo a la unidad) – SLaks

Respuesta

33

Deje caer la barra diagonal en relativePath y debería funcionar.

La razón por la que esto sucede es que Path.Combine está interpretando relativePath como una ruta rooteada (absoluta) porque, en este caso, comienza con \. Puede verificar si una ruta es relativa o rooteada usando Path.IsRooted().

Desde el doc:

Si el uno de los caminos subsiguiente es una ruta absoluta, a continuación, la cosechadora restablece operación de arranque con que ruta absoluta, descartando todos los caminos combinados anteriores.

18

Las rutas que comienzan con una barra inclinada se interpretan como absolutas que relativas. Simplemente corte la barra inclinada si desea garantizar que relativePath será tratado como relativo.

var basePath = @"\\server\BaseFolder"; 
var relativePath = @"\My\Relative\Folder"; 

var combinedPath = Path.Combine(basePath, relativePath.TrimStart('/', '\\')); 
Cuestiones relacionadas