Mega Code Archive

 
Categories / C# / Reflection
 

Returns the path relative to the entry assembly

// $Id: PathUtility.cs 64 2008-05-06 18:29:47Z nvivo $ using System; using System.Reflection; using System.Collections.Generic; using System.IO; using System.Text; namespace DBLGen {     public static class PathUtility     {         /// <summary>         /// Returns the path relative to the entry assembly, or the absolute path if the relative cannot be created.         /// </summary>         public static string GetRelativePath(string absolutePath)         {             string entryPath = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);             return GetRelativePath(entryPath, absolutePath);         }         /// <summary>         /// Returns the path relative to a base directory, or the absolute path if the relative cannot be created.         /// </summary>         public static string GetRelativePath(string baseDirectoryPath, string absolutePath)         {             if (baseDirectoryPath == null)                 throw new ArgumentNullException("basePath");             absolutePath = Path.GetFullPath(absolutePath);             if (baseDirectoryPath.EndsWith("\\"))                 baseDirectoryPath = baseDirectoryPath.Substring(0, baseDirectoryPath.Length - 1);             if (absolutePath.EndsWith("\\"))                 absolutePath = absolutePath.Substring(0, absolutePath.Length - 1);             // split path in parts             string[] baseParts = baseDirectoryPath.Split(Path.DirectorySeparatorChar);             string[] pathParts = absolutePath.Split(Path.DirectorySeparatorChar);             // find out the common parts between them             int baseLength = baseParts.Length;             int common = 0;             for (int i = 0; i < baseLength; i++)             {                 if (String.Compare(baseParts[i], pathParts[i], true) == 0)                     common++;                 else                     break;             }             // if there is no common parts, return the absolute path             if (common == 0)                 return Path.GetFullPath(absolutePath);             // otherwise, continue             StringBuilder sbPath = new StringBuilder(absolutePath.Length);             // if there are still parts in the base path that are not common, add ".."             if (common < baseLength)             {                 for (int i = common; i < baseLength; i++)                 {                     sbPath.Append("..");                     sbPath.Append(Path.DirectorySeparatorChar);                 }             }             // then add the rest of the path              int lastPathIndex = pathParts.Length - 1;             for (int i = common; i <= lastPathIndex; i++)             {                 sbPath.Append(pathParts[i]);                 if (i != lastPathIndex)                     sbPath.Append(Path.DirectorySeparatorChar);             }             return sbPath.ToString();         }         public static string GetAbsolutePath(string path)         {             string entryPath = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);             return GetAbsolutePath(entryPath, path);         }         public static string GetAbsolutePath(string baseDirectoryPath, string path)         {             if (baseDirectoryPath == null)                 throw new ArgumentNullException(baseDirectoryPath);             if (String.IsNullOrEmpty(path))                 return path;             if (Path.IsPathRooted(path))                 return path;             string absolutePath = Path.Combine(baseDirectoryPath, path);             return absolutePath;         }     } }