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; } } }