14

我们知道虚拟目录可以链接到具有不同名称的文件夹,我怎样才能获得虚拟目录的物理路径?

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

例子:

C:\blabla\Sites\Application1\Imaageesss - 在光盘上

Application1\Images(在 ISS 中,我的虚拟目录)

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

4

6 回答 6

15
Server.MapPath("~/Images")

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

于 2013-05-16T00:12:18.447 回答
8

这对我有用:

string physicalPath =    
System.Web.Hosting.HostingEnvironment.MapPath(HttpContext.Current.Request.ApplicationPath);
于 2012-09-17T19:44:48.600 回答
3

如果你试试这个小片段呢?

string physicalPath = HttpContext.Current.Request.MapPath(appPath);
于 2012-06-11T19:47:44.043 回答
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])。

于 2016-09-09T13:37:29.763 回答
1

以下应该可以正常工作:

var physicalPath = HostingEnvironment.MapPath("~/MyVirtualDirectory");
于 2018-11-27T15:09:02.663 回答
0

这可能会回答您的问题:

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

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

于 2012-06-11T19:48:49.797 回答