在相对路径的中间删除../

时间:2014-03-26 15:15:16

标签: c#

我想从中获取

"../lib/../data/myFile.xml"

到这个

"../data/myFile.xml"

我想我可以通过操纵字符串,搜索"../"并使用前面的文件夹取消它们来实现它,但我一直在寻找已经存在的C#解决方案。

尝试从此字符串中实例化Uri并返回toString()。没有帮助。它保持字符串不变。

3 个答案:

答案 0 :(得分:3)

听起来你可能需要自己解析/重建路径,或者使用某种构造良好的正则表达式为你做这个。

采用解析/重建路线,您可以something like

public static string NormalisePath(string path)
{
    var components = path.Split(new Char[] {'/'});

    var retval = new Stack<string>();
    foreach (var bit in components)
    {
        if (bit == "..")
        {
            if (retval.Any())
            {
                var popped = retval.Pop();
                if (popped == "..")
                {
                    retval.Push(popped);
                    retval.Push(bit);
                }
            }
            else
            {
                retval.Push(bit);
            }
        }
        else
        {
            retval.Push(bit);
        }
    }

    var final = retval.ToList();
    final.Reverse();
    return string.Join("/", final.ToArray());
}

(是的,您可能想要更好的变量名称/评论/等。)

答案 1 :(得分:2)

您可以随时尝试使用:

Path.GetFullPath("../lib/../data/myFile.xml")

它的行为与您想要的绝对路径一样,但您可能最终会遇到具有相对路径的奇怪行为,因为它始终基于当前工作目录。例如:

Path.GetFullPath("/lib/../data/myFile.xml")   // C:\data\myFile.xml
Path.GetFullPath("../lib/../data/myFile.xml") // C:\Program Files (x86)\data\myFile.xml

答案 2 :(得分:0)

您可以使用正则表达式执行此操作:

public static string NormalisePath(string path)
{
    return new Regex(@"\.{2}/.*/(?=\.\.)").Replace(path, "");            
}