如何获取虚拟目录物理路径

时间:2012-06-11 19:44:14

标签: asp.net iis

我们知道虚拟指令可以链接到具有不同名称的文件夹,如何获取虚拟目录的物理路径?

我一直在尝试使用HttpContext.Current.server.MapPath,但它返回物理路径加上我在参数中发送的路径,即使该目录甚至不存在,或者它是否存在不同的名称。

例如:

C:\布拉布拉\网站\应用1 \ Imaageesss - 光盘上

Application1 \ Images(在国际空间站,我的虚拟目录)

但如果我在“/ Images”上做一个MapPath,它永远不会给我 C:\ blabla \ Sites \ Application1 \ Imaageesss但是 C:\ inetpub \ wwwroot \ Images不是链接到的真实目录。

6 个答案:

答案 0 :(得分:9)

Server.MapPath("~/Images")

是正确的方法,因为“〜”引用了应用程序的根目录。

答案 1 :(得分:6)

这对我有用:

string physicalPath =    
System.Web.Hosting.HostingEnvironment.MapPath(HttpContext.Current.Request.ApplicationPath);

答案 2 :(得分:3)

如果你尝试这个小片段怎么办?

string physicalPath = HttpContext.Current.Request.MapPath(appPath);

答案 3 :(得分:1)

经过一些研究后,我能够创建一种方法来获取虚拟IIS目录的物理路径:

public static string VirtualToPhysicalPath(string vPath) {
    // Remove query string:
    vPath = Regex.Replace(vPath, @"\?.+", "").ToLower();

    // Check if file is in standard folder:
    var pPath = System.Web.Hosting.HostingEnvironment.MapPath("~" + vPath);
    if (System.IO.File.Exists(pPath)) return pPath;

    // Else check for IIS virtual directory:
    var siteName = System.Web.Hosting.HostingEnvironment.ApplicationHost.GetSiteName();
    var sm = new Microsoft.Web.Administration.ServerManager();
    var vDirs = sm.Sites[siteName].Applications[0].VirtualDirectories;
    foreach (var vd in vDirs) {
        if (vd.Path != "/" && vPath.Contains(vd.Path.ToLower())) pPath = vPath.Replace(vd.Path.ToLower(), vd.PhysicalPath).Replace("/", "\\");
    }
    return pPath;
}

警告:此解决方案假设您只有一个根应用程序(Applications [0])。

答案 4 :(得分:0)

这可能会回答你的问题:

http://msdn.microsoft.com/en-us/library/system.web.httprequest.physicalpath.aspx

但是,我目前无法提供一个例子,因为我有很多工作要做。当我找到一些时间时,我会发送详细信息。

答案 5 :(得分:0)

以下内容应该可以正常工作:

var physicalPath = HostingEnvironment.MapPath("~/MyVirtualDirectory");