Server.MapPath(“。”),Server.MapPath(“〜”),Server.MapPath(@“\”),Server.MapPath(“/”)。 有什么不同?

任何人都可以解释Server.MapPath(".")Server.MapPath("~")Server.MapPath(@"\")Server.MapPath("/")之间的区别吗?

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

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

一个例子:

假设您指定了一个网站应用程序( 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() ,则MapPath()返回一个path,就像Path是完整的虚拟path一样。

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

注意:在C#中, @是逐字string操作符,意思是该string应该被“按原样”使用,而不是为了转义序列而被处理。

脚注

  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(".")