编程语言
首页 > 编程语言> > c#-这种使相对路径有效的方法吗?

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