代码之家  ›  专栏  ›  技术社区  ›  David

如何使用server.mappath获取ASP.NET中网站文件夹外部的位置

  •  11
  • David  · 技术社区  · 14 年前

    当我的ASP.NET站点使用文档(例如XML)时,我通常按如下方式加载文档:

    Server.MapPath("~\Documents\MyDocument.xml")
    

    但是,我想将“文档”文件夹移出“网站”文件夹,以便它现在是“网站”文件夹的同级。这将使维护文档变得相当容易。

    但是,将文档加载代码重写如下:

    Server.MapPath("../../Documents/MyDocument.xml")
    

    导致ASP.NET投诉它无法“从顶层目录退出”。

    那么,有人能建议我如何相对地指定网站文件夹之外文件夹的位置吗?出于明显的部署原因,我真的不想指定绝对路径。

    谢谢

    戴维

    4 回复  |  直到 7 年前
        1
  •  25
  •   MSDN.WhiteKnight    7 年前

    如果知道它与Web根目录的相对位置,可以使用 Server.MapPath 获取Web根目录的物理位置,然后 Path class 获取文档路径的方法。

    在粗略的未选中代码中,比如:

    webRootPath = Server.MapPath("~")
    docPath = Path.GetFullPath(Path.Combine(rootPath, "../Documents/MyDocument.xml"))
    

    对不起,如果我把语法搞错了,但是 Path 类应该是使用真正的fs路径(而不是web类型路径)所需要的。

    你的方法失败的原因是 Serv.MappAthas 获取Web服务器上的一个位置,而您提供的位置无效,因为它位于服务器层次结构根目录的顶部。

        2
  •  5
  •   Tadas Å ukys    14 年前
    docPath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"..\Documents\MyDocument.xml");
    

    AppDomain.BaseDirectory 返回当前Web应用程序集目录路径。

        3
  •  1
  •   cleftheris    13 年前

    如果需要解析绝对或相对路径(甚至在Web应用根文件夹之外),请使用以下方法:

    public static class WebExtesions
    {
        public static string ResolveServerPath(this HttpContextBase context, string path) {
            bool isAbsolute = System.IO.Path.IsPathRooted(path);
            string root = context.Server.MapPath("~");
            string absolutePath = isAbsolute ? 
                                        path : 
                                        Path.GetFullPath(Path.Combine(root, path));
            return absolutePath;
        }
    }
    
        4
  •  0
  •   user240141    14 年前

    如果要指定硬盘驱动器中的某个位置,那么它在Web环境中不容易获得。如果文件的大小和数量较小,则可以将其保存在目录中,然后使用~/path-till目录进行指向。

    但在某些情况下,我们使用请求对象。如需更多信息,请访问此链接

    http://msdn.microsoft.com/en-us/library/5d5940ad.aspx