如何使用Server.MapPath获取ASP.NET中网站文件夹外的位置

时间:2010-08-06 08:53:55

标签: asp.net relative-path

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

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

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

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

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

导致ASP.NET抱怨它无法“退出顶级目录”。

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

由于

大卫

4 个答案:

答案 0 :(得分:27)

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

粗略的未经检查的代码类似于:

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

很抱歉,如果我的语法错误,但Path类应该是您使用真正的FS路径而不是Web类型路径。

您的方法失败的原因是Server.MapPath占用了您的Web服务器上的某个位置,而您提供的位置无效,因为它位于服务器层次结构根目录的顶部。

答案 1 :(得分:5)

docPath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"..\Documents\MyDocument.xml");

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

答案 2 :(得分:1)

如果你需要在绝对或相对的情况下解析路径(甚至在web app根文件夹之外),请使用:

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;
    }
}

答案 3 :(得分:0)

如果要在硬盘驱动器中指定位置,则在Web环境中不容易使用它。如果文件的大小和数量较小,那么您可以将其保存在目录中,然后使用〜/ path直到目录。

但在某些情况下我们曾经做过Request对象。欲了解更多信息,请访问此链接

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