Server.MapPath("."), Server.MapPath("~"), Server.MapPath(@"\"), Server.MapPath("/")。有什么不同?

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

512049 次浏览

服务器。MapPath指定映射到物理目录的相对路径或虚拟路径。

  • Server.MapPath(".")1返回正在执行的文件(例如aspx)的当前物理目录
  • Server.MapPath("..")返回父目录
  • Server.MapPath("~")返回应用程序根的物理路径
  • Server.MapPath("/")返回域名根的物理路径(不一定与应用程序的根相同)

一个例子:

假设你指向一个网站应用程序(http://www.example.com/)

C:\Inetpub\wwwroot

并安装了您的商店应用程序(子web作为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("")也会产生这种效果

再进一步扩展一下@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(".")

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