Mega Code Archive

 
Categories / C# / File Stream
 

Combines two paths, removing root-folder combinations

/*  * Filename:    FileUtil.cs  * Product:     Versioning Controlled Build  * Solution:    BuildAutoIncrement  * Project:     Shared  * Description: File utility methods.  * Copyright:   Julijan ?ribar, 2004-2007  *   * This software is provided 'as-is', without any express or implied  * warranty.  In no event will the author(s) be held liable for any damages  * arising from the use of this software.  *  * Permission is granted to anyone to use this software for any purpose,  * including commercial applications, and to alter it and redistribute it  * freely, subject to the following restrictions:  *  * 1. The origin of this software must not be misrepresented; you must not  *    claim that you wrote the original software. If you use this software  *    in a product, an acknowledgment in the product documentation would be  *    appreciated but is not required.  * 2. Altered source versions must be plainly marked as such, and must not be  *    misrepresented as being the original software.  * 3. This notice may not be removed or altered from any source distribution.  */ using System; using System.Diagnostics; using System.IO; using System.Text; using System.Text.RegularExpressions; namespace BuildAutoIncrement {     /// <summary>   /// A set of file utilities.   /// </summary>   public struct FileUtil {         /// <summary>         ///   Combines two paths, removing root-folder combinations.         /// </summary>         /// <param name="rootPath">         /// </param>         /// <param name="relativePath">         /// </param>         /// <returns></returns>         public static string CombinePaths(string rootPath, string relativePath) {             Debug.Assert(Path.IsPathRooted(rootPath));             Debug.Assert(!Path.IsPathRooted(relativePath));             string root = Path.GetPathRoot(rootPath);             // remove any trailing path separators             if (Path.GetPathRoot(rootPath) != rootPath)                 rootPath = rootPath.Trim(DirectorySeparators);             int lastSeparator = rootPath.Length;             string[] relativePathComponents = relativePath.Split(DirectorySeparators);             int i;             for (i = 0; i < relativePathComponents.Length; i++) {                 if (relativePathComponents[i].Equals("..")) {                     lastSeparator = rootPath.LastIndexOfAny(DirectorySeparators, lastSeparator - 1);                     Debug.Assert(lastSeparator > 0);                     rootPath = rootPath.Substring(0, lastSeparator + 1);                 }                 else if (!relativePathComponents[i].Equals(".")) {                     break;                  }             }             Debug.Assert(i < relativePathComponents.Length);             for (int j = i; j < relativePathComponents.Length; j++) {                 rootPath = Path.Combine(rootPath, relativePathComponents[j]);             }             return rootPath;         }         /// <summary>         ///   Directory separator characters.         /// </summary>         public static readonly char[] DirectorySeparators = new char[] {Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar };   } }