【问题标题】:Converting relative paths to absolute paths C#将相对路径转换为绝对路径 C#
【发布时间】:2010-07-15 12:56:46
【问题描述】:

我有一个程序可以搜索 html 文件并查找 href 标记,获取其中的字符串(链接),并将其转换为文件位置。

当href标签使用相对链接时,问题就来了,例如:

<a href="../../../images/arrow.gif"/>

在这种情况下,我的程序返回:

\\server\webroot\folder\foo\bar\mew\..\..\..\images\arrow.gif

例如(因为它不以“http”开头,它会将其所在文件的路径附加到开头)。

显然,这可以简化为:

\\server\webroot\folder\images\arrow.gif

是否有一个对象可以进行这种简化,或者我是否需要进行一些字符串解析 - 如果有,最好的方法是什么?

【问题讨论】:

  • 您的两个答案似乎假设您的应用程序在不同的模式下运行(即本地文件系统与通过网络检索文件,使用 URLS。)请澄清您的问题以提出任何一个回答你接受清楚。 (他们都对作者的假设很准确。)

标签: c# string path uri


【解决方案1】:

我假设您在这里使用的是 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"));

【讨论】:

  • Path.GetFullPath("\\server\webroot\folder\foo\bar\mew\..\..\..\images\arrow.gif") 完成这项工作 - 太好了,谢谢:)
【解决方案2】:

在这里查看答案:

https://stackoverflow.com/a/42939289/2338477

这样更好,因为它不需要Uri重新映射的路径,而GetFullPath又涉及文件系统操作,因为这个答案可能会比这里的其他版本更快。 (纯字符串操作)

【讨论】:

    【解决方案3】:

    您可以使用 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);
    

    【讨论】:

      【解决方案4】:

      Path类提供GetFullPath(string path)方法

      例如

      Path.GetFullPath(@"\\server\webroot\folder\foo\bar\mew\..\..\..\images\arrow.gif")
      

      返回

      @"\\server\webroot\folder\images\arrow.gif"
      

      【讨论】:

        【解决方案5】:

        查看明显的候选人:

        • Path
        • DirectoryInfo

        我敢打赌他们有办法做到这一点。猜测:为您的路径创建一个新的 DirectoryInfo 对象,然后检查属性 - 可能是某处的规范路径...

        【讨论】:

          猜你喜欢
          • 2017-08-01
          • 2011-11-07
          • 2011-05-02
          • 2016-12-14
          相关资源
          最近更新 更多