Returns the path argument adjusted to be relative to the base path. Absolute path names will be returned unchanged.
// Copyright ? Microsoft Corporation.
// This source file is subject to the Microsoft Permissive License.
// See http://www.microsoft.com/resources/sharedsource/licensingbasics/sharedsourcelicenses.mspx.
// All other rights reserved.
using System;
using System.Text;
using System.Xml;
using System.Xml.Xsl;
using System.Xml.XPath;
using System.Diagnostics;
using System.Collections.Generic;
class Util {
/// <summary>
/// Returns the path argument adjusted to be relative to the base path. Absolute path names will
/// be returned unchanged.
/// </summary>
/// <example>
/// path: "xxx/aaa/target.html"
/// basePath: "xxx/bbb/source.html"
/// result: "../aaa/target.html"
/// </example>
public static string GetRelativePath(string path, string basePath) {
// ignore absolute path names and an empty basePath
if (!string.IsNullOrEmpty(path) && path[0] != '/' && !string.IsNullOrEmpty(basePath)) {
List<string> pathParts = new List<string>(path.Split('/'));
List<string> basePathParts = new List<string>(basePath.Split('/'));
// remove the base path file name
if (basePathParts.Count > 0)
basePathParts.RemoveAt(basePathParts.Count - 1);
// strip common base path bits
while (pathParts.Count > 0 && basePathParts.Count > 0 &&
string.Equals(pathParts[0], basePathParts[0], StringComparison.CurrentCultureIgnoreCase)) {
pathParts.RemoveAt(0);
basePathParts.RemoveAt(0);
}
// move up one level for each remaining base path part
foreach (string s in basePathParts)
pathParts.Insert(0, "..");
path = string.Join("/", pathParts.ToArray());
}
return path;
}
}
Related examples in the same category