¿Por qué todas esas soluciones complicadas?
¿Y en relación con Uri? De Verdad ? No tendrá que esperar mucho para la primera excepción.
Brilla en simplicidad.
No hay necesidad de ninguna clase de marco adicional.
public static string BuildRelativePath(string absolutePath, string basePath)
{
return absolutePath.Substring(basePath.Length);
}
Y en caso de que no se puede administrar para agregar siempre o siempre omitir la System.IO.Path.DirectorySeparatorChar de cierre de las cuerdas, o no es capaz de no mezclar los argumentos:
public static string FaultTolerantRelativePath(string absolutePath, string basePath)
{
if(absolutePath == null || basePath == null)
return null;
absolutePath = absolutePath.Replace(System.IO.Path.DirectorySeparatorChar, '/');
basePath = basePath.Replace(System.IO.Path.DirectorySeparatorChar, '/');
if (!basePath.EndsWith("/"))
basePath += "/";
if (!absolutePath.EndsWith("/"))
absolutePath += "/";
if (absolutePath.Length < basePath.Length)
throw new ArgumentException("absolutePath.Length < basePath.Length ? This can't be. You mixed up absolute and base path.");
string resultingPath = absolutePath.Substring(basePath.Length);
resultingPath = resultingPath.Replace('/', System.IO.Path.DirectorySeparatorChar);
return resultingPath;
}
¿No sería el resultado esperado "MoreSubFolder \ LastFolder \ SomeFile.txt"? –
¡Sí, gracias por señalar mi error! – asmo
Debe reformular esto. Lo leí dos veces, y todavía no estoy seguro de lo que realmente quieres.De lo contrario, estoy tentado de responder: use los métodos IndexOf y Substring para obtener la segunda parte de la ruta (o para eliminar la primera parte de la ruta), y tengo la sensación de que no es lo que quiere. Mire en los métodos estáticos de la clase System.IO.Path: tiene algunos buenos ayudantes para combinar rutas y similares. –