using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Collections.Specialized;
namespace Genuilder.Extensibility
{
public class PathUtil
{
///
/// Creates a relative path from one file
/// or folder to another.
///
///
/// Contains the directory that defines the
/// start of the relative path.
///
///
/// Contains the path that defines the
/// endpoint of the relative path.
///
///
/// The relative path from the start
/// directory to the end path.
///
///
public static string RelativePathTo(
string fromDirectory, string toPath)
{
if(fromDirectory == null)
throw new ArgumentNullException("fromDirectory");
if(toPath == null)
throw new ArgumentNullException("toPath");
bool isRooted = Path.IsPathRooted(fromDirectory)
&& Path.IsPathRooted(toPath);
if(isRooted)
{
bool isDifferentRoot = string.Compare(
Path.GetPathRoot(fromDirectory),
Path.GetPathRoot(toPath), true) != 0;
if(isDifferentRoot)
return toPath;
}
StringCollection relativePath = new StringCollection();
string[] fromDirectories = fromDirectory.Split(
Path.DirectorySeparatorChar);
string[] toDirectories = toPath.Split(
Path.DirectorySeparatorChar);
int length = Math.Min(
fromDirectories.Length,
toDirectories.Length);
int lastCommonRoot = -1;
// find common root
for(int x = 0; x < length; x++)
{
if(string.Compare(fromDirectories[x],
toDirectories[x], true) != 0)
break;
lastCommonRoot = x;
}
if(lastCommonRoot == -1)
return toPath;
// add relative folders in from path
for(int x = lastCommonRoot + 1; x < fromDirectories.Length; x++)
if(fromDirectories[x].Length > 0)
relativePath.Add("..");
// add to folders to path
for(int x = lastCommonRoot + 1; x < toDirectories.Length; x++)
relativePath.Add(toDirectories[x]);
// create relative path
string[] relativeParts = new string[relativePath.Count];
relativePath.CopyTo(relativeParts, 0);
string newPath = string.Join(
Path.DirectorySeparatorChar.ToString(),
relativeParts);
return newPath;
}
}
}