我有一个程序可以搜索html文件并找到href标签,将字符串置于内部(链接),然后将其转换为文件位置。
当href标签使用相对链接时会出现问题,例如:
<a href="../../../images/arrow.gif"/>
在这种情况下,我的程序返回:
\\server\webroot\folder\foo\bar\mew\..\..\..\images\arrow.gif
例如(因为它不以“http”开头,它会将文件的路径追加到开头)。
显然,这可以简化为:
\\server\webroot\folder\images\arrow.gif
是否有一个对象可以进行这种简化,或者我是否需要进行一些字符串解析 - 如果有,那么最好的方法是什么?
答案 0 :(得分:6)
您可以使用Uri类来组合它们:
Uri root = new Uri(@"\\server\webroot\folder\foo\bar\mew\", UriKind.Absolute);
Uri relative = new Uri("../../../images/arrow.gif", UriKind.Relative);
Uri comb = new Uri(root, relative);
答案 1 :(得分:3)
我假设你在这里使用ASP.NET。在这种情况下,我认为您只是希望Server.MapPath
函数返回文件的实际物理URI。
var absoluteUrl = this.Server.MapPath("../../../images/arrow.gif");
// absoluteUrl = "\\server\webroot\folder\images\arrow.gif"
(this
当然是指当前页面。如果由于某种原因无效,您可以随时使用HttpContext.Current.Server
。)
注意:强>
如果您想手动执行操作并且已经有一个特定的字符串,例如“\ server \ webroot \ folder \”,则System.IO.Path
的功能应该完成我认为的工作:
var absoluteUri = Path.GetFullPath(Path.Combine("\\server\webroot\folder\",
"../../../images/arrow.gif"));
答案 2 :(得分:3)
Path类提供方法GetFullPath(字符串路径)
例如
Path.GetFullPath(@"\\server\webroot\folder\foo\bar\mew\..\..\..\images\arrow.gif")
返回
@"\\server\webroot\folder\images\arrow.gif"
答案 3 :(得分:1)
查看明显的候选人:
Path
DirectoryInfo
我敢打赌他们有一些方法可以做到这一点。猜猜:为你的路径创建一个新的DirectoryInfo
对象然后检查属性 - 可能是那里的规范路径......
答案 4 :(得分:1)
在此处查看答案
https://stackoverflow.com/a/42939289/2338477
更好,因为它不需要重新映射Uri
的路径,并且GetFullPath
依次涉及文件系统操作,并且由于此答案可能比此处的其他版本更快。 (纯字符串操作)