提问



谁能解释Server.MapPath(".")Server.MapPath("~")Server.MapPath(@"\")Server.MapPath("/")之间的区别?

最佳参考


Server.MapPath 指定将映射到物理目录的相对路径或虚拟路径。



  • Server.MapPath(".") 1 返回正在执行的文件的当前物理目录(例如aspx)

  • Server.MapPath("..")返回父目录

  • Server.MapPath("~")返回应用程序根目录的物理路径

  • Server.MapPath("/")返回域名根目录的物理路径(不一定与应用程序的根目录相同)



一个例子:


让我们说你指出一个网站应用程序(http://www.example.com/)


C:\Inetpub\wwwroot


并安装了您的商店应用程序(子网站为IIS中的虚拟目录,标记为应用程序)


D:\WebApps\shop


例如,如果您在以下请求中调用Server.MapPath():


http://www.example.com/shop/products/GetProduct.aspx?id=2342


然后:



  • Server.MapPath(".") 1 返回D:\WebApps\shop\products

  • Server.MapPath("..")返回D:\WebApps\shop

  • Server.MapPath("~")返回D:\WebApps\shop

  • Server.MapPath("/")返回C:\Inetpub\wwwroot

  • Server.MapPath("/shop")返回D:\WebApps\shop



如果Path以正斜杠(/)或反斜杠(\)开始,则MapPath()返回路径,就像Path是一个完整的虚拟路径一样。


如果Path不以斜杠开头,则MapPath()返回相对于正在处理的请求的目录的路径。


注意:在C#中,@是逐字文字字符串运算符,意味着字符串应该按原样使用,而不是为转义序列处理。


脚注



  1. Server.MapPath(null)Server.MapPath("")也会产生这种效果。


其它参考1


只是为了扩展@splattne的答案:


MapPath(string virtualPath)调用以下内容:


public string MapPath(string virtualPath)
{
    return this.MapPath(VirtualPath.CreateAllowNull(virtualPath));
}


MapPath(VirtualPath virtualPath)依次调用MapPath(VirtualPath virtualPath, VirtualPath baseVirtualDir, bool allowCrossAppMapping),其中包含以下内容:


//...
if (virtualPath == null)
{
    virtualPath = VirtualPath.Create(".");
}
//...


所以,如果你打MapPath(null)MapPath(""),你实际上是在呼MapPath(".")

其它参考2


1)Server.MapPath(".") - 返回正在执行的文件的当前物理目录(例如aspx)。


防爆。假设D:\WebApplications\Collage\Departments


2)Server.MapPath("..") - 返回父目录


防爆。 D:\WebApplications\Collage


3)Server.MapPath("~") - 返回应用程序根目录的物理路径


防爆。 D:\WebApplications\Collage


4)Server.MapPath("/") - 返回域名根目录的物理路径


防爆。 C:\Inetpub\wwwroot