Posted by Paul Welter on Wednesday, February 08 2006 at 1:38 AM

Here is a code snippet that is equivalent to the windows API PathRelativePathTo as native c#. The function creates a relative path from one file or folder to another.

public class PathUtil
{
    /// <summary>
    /// Creates a relative path from one file
    /// or folder to another.
    /// </summary>
    /// <param name="fromDirectory">
    /// Contains the directory that defines the 
    /// start of the relative path.
    /// </param>
    /// <param name="toPath">
    /// Contains the path that defines the
    /// endpoint of the relative path.
    /// </param>
    /// <returns>
    /// The relative path from the start
    /// directory to the end path.
    /// </returns>
    /// <exception cref="ArgumentNullException"></exception>
    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;
    }
 
}
No Comments Posted in: Snippets    Tagged as: , ,

Similar Posts

  1. Caching the results from LinqDataSource
  2. Stopwatch class from .net 2.0 framework ported .net 1.1
  3. Google Toolbar Spell Check API

Comments

Show/Hide Trackbacks
There are no comments yet...

Leave a Comment