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 };
}
}
Related examples in the same category