我想从中获取
"../lib/../data/myFile.xml"
到这个
"../data/myFile.xml"
我想我可以通过操纵字符串,搜索"../"
并使用前面的文件夹取消它们来实现它,但我一直在寻找已经存在的C#解决方案。
尝试从此字符串中实例化Uri
并返回toString()。没有帮助。它保持字符串不变。
答案 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, "");
}