2010-11-01 19 views

Respuesta

10
No

seguro si hay una manera mejor, pero esto funcionará:

var file1 = @"c:\temp1\adam\"; 
var file2 = @"c:\temp1\jamie\"; 

var result = new Uri(file1) 
    .MakeRelativeUri(new Uri(file2)) 
    .ToString() 
    .Replace("/", "\\"); 
2

esto es simple. Pasos:

  1. Retire principio común de la cadena (c:\temp1\)
  2. Contar el número de directorios de primera vía (1) en su caso
  3. los reemplazan con ..
  4. Añadir segundo camino
+2

pero no conoce el prefijo común! (paso 1) –

+1

Encontrar el prefijo común de dos cadenas no es tan difícil. El problema radica en los detalles. Ambos/y \ son separadores de ruta, algunos sistemas de archivos no distinguen entre mayúsculas y minúsculas, otros distinguen entre mayúsculas y minúsculas, una ruta puede contener. o ... y probablemente varios otros problemas. Por otro lado, subestimar la parte común no es un gran problema. – CodesInChaos

+0

@Mitch Wheat, pensé que era obvio – Andrey

2

Actualizado: dado que el constructor ahora está obsoleto, puede usar:

Uri.UnescapeDataString(new Uri(file1).MakeRelativeUri(new Uri(file2)).ToString()) 
    .Replace("/", "\\"); 

versión antigua:

idea de Kirk Woll es buena pero hay que asegurarse de que su camino no que no se rompa (por ejemplo, espacios reemplazados por% 20) al decirle a Uri que no se salga de tu camino:

var result = new Uri(file1, true) 
    .MakeRelativeUri(new Uri(file2, true)) 
    .ToString() 
    .Replace("/", "\\"); 
+0

Hmm, pensé que este era un buen punto, pero vale mencionar que ese constructor se considera obsoleto y generará una advertencia de compilación. En mi prueba, no tuve ningún problema con los personajes escapados. Me pregunto qué personajes se están escapando para ti. –

+0

@Kirk Woll, tuve problemas con espacios en el nombre. – laktak

+0

Ah, duh, lo siento, no me di cuenta de que habías mencionado eso. Gracias por responder. –

Cuestiones relacionadas