2012-06-11 70 views
8

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

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

例:

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

应用1 \图像(ISS,我的虚拟目录中)

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

+0

以下所有答案都不能解决问题。我认为MapPath不够智能来检查它是否是虚拟IIS目录。它只是将应用程序根路径添加到您提供的路径。不幸的是,即使在深入搜索网页后,我也找不到解决方案。 – needfulthing

+0

找到了方法,请参阅下面的答案。 – needfulthing

+0

在两种不同的情况下,我有类似的问题。在一种情况下,我不得不调用'Server.MapPath(“/ Application1/Images/image.jpg”)'而不是'Server.MapPath(“/ Images/image.jpg”)',另一种情况是我在我的应用程序中错误引用了我的虚拟目录名称。我得到了同样的结果,直到我做了每件事情之前,OP都经历着这样的结果。只是以为我会加上... – ionalchemist

回答

9
Server.MapPath("~/Images") 

是去它作为应用程序的“〜”引用根的正确方法。

2

如果您尝试使用这个小片段,该怎么办?

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

这可能会回答你的问题:

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

不过,我目前还不能提供一个例子,因为我已经得到了很多的工作要做。当我找到一些时间时,我会发送详细信息。

+1

谢谢,但经过长时间的测试后我才发现我的错误。我正在寻找的虚拟目录是在一个应用程序,所以我需要做HttpContext.Current.server.MapPath(“/应用程序/图像”),而不是“/图像” – Vinhent

5

这是对我工作:

string physicalPath =  
System.Web.Hosting.HostingEnvironment.MapPath(HttpContext.Current.Request.ApplicationPath); 
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; 
} 

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

相关问题