将一个绝对路径,使用相对路径后得到新的绝对路径
void Main()
{
var originPath = "D:/temp/a/";
var p0 = "";
var p1 = "./";
var p2 = "../../data/";
var p3 = "D:/data/";
ResolveRelativeToAbsolutePath(originPath,p0).Dump();//->D:/temp/a/
ResolveRelativeToAbsolutePath(originPath,p1).Dump();//->D:/temp/a/
ResolveRelativeToAbsolutePath(originPath,p2).Dump();//->D:/data/
ResolveRelativeToAbsolutePath(originPath,p3).Dump();//->D:/data/
}
/// <summary>
/// 将相对路径转为绝对路径
/// </summary>
/// <param name="originPath"></param>
/// <param name="newPath"></param>
/// <returns></returns>
public static string ResolveRelativeToAbsolutePath(string originPath, string newPath)
{
if(string.IsNullOrWhiteSpace(newPath))return originPath;
originPath = originPath.Replace("\\", "/").TrimEnd('/') + "/";
newPath = newPath.Replace("\\", "/").TrimEnd('/') + "/";
if (!newPath.StartsWith("."))
{
return newPath;
}
string[] originPathArray = originPath.Split("/").Where(p => !string.IsNullOrEmpty(p)).ToArray();
string[] newPathArray = newPath.Split("/").Where(p => !string.IsNullOrEmpty(p)).ToArray();
int originPathArrayLength = originPathArray.Length;
int newPathArrayLength = newPathArray.Length;
int i = 0;
for (; i < newPathArrayLength; i++)
{
if (newPathArray[i] == ".")
{
continue;
}
else if (newPathArray[i] == "..")
{
if (originPathArrayLength > 0 && !originPathArray[originPathArrayLength - 1].EndsWith(":"))
{
originPathArrayLength--;
}
else
{
break;
}
}
else
{
break;
}
}
originPathArray = originPathArray.Take(originPathArrayLength).ToArray();
newPathArray = newPathArray.Skip(i).ToArray();
var path = string.Join("/", originPathArray) + "/" + string.Join("/", newPathArray);
if(!path.EndsWith("/")) path +="/";
return path;
}