Gets the relative path from a source to a target path.
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
namespace StyleCopContrib.Runner
{
/// <summary>
/// A path utility class.
/// </summary>
public static class PathUtility
{
#region Methods
/// <summary>
/// Gets the relative path from a source to a target path.
/// </summary>
/// <param name="fromPath">The from source path.</param>
/// <param name="toPath">The to target path.</param>
/// <returns>The relative path.</returns>
public static string GetRelativePath(string fromPath, string toPath)
{
if (!Path.IsPathRooted(fromPath) || !Path.IsPathRooted(toPath))
{
throw new InvalidOperationException("Only fully qualified path are supported");
}
string relativePath;
string[] fromPathParts = fromPath.Split(Path.DirectorySeparatorChar);
string[] toPathParts = toPath.Split(Path.DirectorySeparatorChar);
int partIndex = 0;
while (partIndex < fromPathParts.Length)
{
if (fromPathParts[partIndex].ToUpperInvariant() != toPathParts[partIndex].ToUpperInvariant()) break;
partIndex++;
}
if (partIndex == 0)
{
relativePath = toPath;
}
else
{
string backPath = string.Join(Path.DirectorySeparatorChar.ToString(),
Enumerable.Repeat("..", fromPathParts.Length - partIndex).ToArray());
string forewardPath = string.Join(Path.DirectorySeparatorChar.ToString(), toPathParts, partIndex,
toPathParts.Length - partIndex);
if (!string.IsNullOrEmpty(backPath))
{
relativePath = string.Concat(backPath, Path.DirectorySeparatorChar, forewardPath);
}
else
{
relativePath = forewardPath;
}
}
return relativePath;
}
#endregion
}
}
Related examples in the same category