参考:点击打开链接, 有改动。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Text.RegularExpressions;
namespace ConsoleApplication2
{
class Program
{
public class MyPath
{
public string AbsolutePath { get; set; }
public string RelativePath { get; set; }
public string Result
{
get
{
return GetAbsPath(this.AbsolutePath, this.RelativePath);
}
}
public override string ToString()
{
return string.Format("AbsolutePath : {0},\r\nRelativePath : {1},\r\nResult: {2}\r\n------------\r\n",
this.AbsolutePath
, this.RelativePath
, this.Result
);
}
}
static void Main(string[] args)
{
List<MyPath> list = new List<MyPath>() {
new MyPath(){ AbsolutePath = @"C:\Program Files\Internet Explorer", RelativePath=@"..\..\..\..\..\..\..\..\..\..\getTime.ps1" },
new MyPath(){ AbsolutePath = @"C:\Program Files\Internet Explorer", RelativePath=@"..\mypath\getTime.ps1" },
new MyPath(){ AbsolutePath = @"C:\Program Files\Internet Explorer", RelativePath=@"..\TestPath\subpath" },
new MyPath(){ AbsolutePath = @"C:\Program Files\Internet Explorer", RelativePath=@"..\" },
new MyPath(){ AbsolutePath = @"C:\Program Files\Internet Explorer", RelativePath=@".\" },
new MyPath(){ AbsolutePath = @"C:\Program Files\Internet Explorer", RelativePath=@".\xx.bat" },
};
list.ForEach((item)=> {
Console.WriteLine(item.ToString());
});
Console.Read();
}
private static string GetAbsPath(string absolutePath, string relativePath)
{
string fileName = Path.GetFileName(relativePath);
relativePath = relativePath.Substring(0, relativePath.Length - fileName.Length);
string splicingResult = absolutePath;
if (!Path.IsPathRooted(relativePath) && relativePath!=@".\" )
{
//匹配相对路径,匹配需要向上推的目录层数
Regex regex = new Regex(@"^\\|([..]+)");
int backUp = regex.Matches(relativePath).Count;
List<string> pathes = absolutePath.Split("\\".ToCharArray()).ToList();
if (pathes.Count < backUp)
{
pathes.RemoveRange(0, pathes.Count);
}
else
{
pathes.RemoveRange(pathes.Count - backUp, backUp);
}
//匹配文件名,匹配需要附加的目录层数
regex = new Regex(@"^\\|([a-zA-Z0-9]+)");
MatchCollection matches = regex.Matches(relativePath);
foreach (Match match in matches)
{
pathes.Add(match.Value);
}
//驱动器地址取绝对路径中的驱动器地址
if (pathes.Count == 0)
{
splicingResult = Path.Combine(splicingResult, Path.GetPathRoot(absolutePath));
}
else
{
pathes[0] = Path.GetPathRoot(absolutePath);
foreach (string p in pathes)
{
splicingResult = Path.Combine(splicingResult, p);
}
}
}
return splicingResult + "\\" + fileName;
}
}
}