c#-这种使相对路径有效的方法吗?
作者:互联网
由于.NET不包含用于创建相对路径的API,因此我改用了Uri的MakeRelativeUri方法.这行得通,但是我遇到了几种情况,这并不是由于Uri逃脱了.因此,我也对此进行了修补:
public static string MakeRelativePath(string basePath, string tgtPath) {
return
Uri.UnescapeDataString(
new Uri(basePath, UriKind.Absolute)
.MakeRelativeUri(new Uri(tgtPath, UriKind.Absolute))
.ToString()
).Replace('/', Path.DirectorySeparatorChar);
}
这个版本似乎可以用,但是让我感到有些古怪:没有任何有效的本地文件系统路径会被这种无意的转义破坏掉吗?
相关:How to get relative path from absolute path
该问题的答案根本没有解决不寻常字符和转义的问题,因此不能回答此问题.
解决方法:
除了转义,取消转义和替换,您可以仅使用System.Uri和PathDifference方法使用的基础算法.在这里,可以通过Reflector进行恢复并进行修改以提高可读性.还对它进行了修改,以对DOS样式的路径使用反斜杠,而不对URI使用正斜杠,并且比较始终不区分大小写.
static string PathDifference(string path1, string path2)
{
int c = 0; //index up to which the paths are the same
int d = -1; //index of trailing slash for the portion where the paths are the same
while (c < path1.Length && c < path2.Length)
{
if (char.ToLowerInvariant(path1[c]) != char.ToLowerInvariant(path2[c]))
{
break;
}
if (path1[c] == '\\')
{
d = c;
}
c++;
}
if (c == 0)
{
return path2;
}
if (c == path1.Length && c == path2.Length)
{
return string.Empty;
}
System.Text.StringBuilder builder = new System.Text.StringBuilder();
while (c < path1.Length)
{
if (path1[c] == '\\')
{
builder.Append(@"..\");
}
c++;
}
if (builder.Length == 0 && path2.Length - 1 == d)
{
return @".\";
}
return builder.ToString() + path2.Substring(d + 1);
}
输入的期望似乎是,如果任何一个路径表示目录,则该路径必须带有尾部反斜杠.显然,路径也必须为非空.
以下是一些示例输入和输出…看看它是否满足您的需求.
Path1 Path2 Output
C:\test\path1\path2\ C:\test\ ..\..\
C:\test\path1\file C:\test\ ..\
C:\test\path1\path2\ C:\ ..\..\..\
C:\test\path1\path2\ D:\ D:\
C:\test\path1\path2\ C:\test\path1\pathA ..\pathA
C:\test\ C:\test\
C:\test\ C:\test\file file
C:\test\file C:\test\ .\
C:\test\path #1!\path2\ C:\test\ ..\..\
标签:path,relative-path,uri,c,net 来源: https://codeday.me/bug/20191102/1992275.html