Server.MapPath(“.”), Server.MapPath(“~”), Server.MapPath(@“\”), Server.MapPath(“/”).有什么区别?

Server.MapPath("."), Server.MapPath("~"), Server.MapPath(@"\"), Server.MapPath("/"). What is the difference?

提问人:Manu 提问时间:11/9/2008 最后编辑:dav_iManu 更新时间:8/1/2023 访问量:519517

问:

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

asp.net 路径 目录 映射 文件系统

评论


答:

843赞 splattne 11/9/2008 #1

Server.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 以正斜杠 () 或反斜杠 () 开头,则返回一个路径,就好像 Path 是一个完整的虚拟路径一样。/\MapPath()

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

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

脚注

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

评论

45赞 gbn 5/10/2010
非常好。我们一直在与 Server.Bloody.MapPath 作斗争。谢谢
27赞 skolima 7/25/2012
你最好使用,因为它不需要:stackoverflow.com/q/944219/3205HostingEnvironment.MapPathHttpContext
0赞 PaulScott 3/3/2021
两个问题,如下:(1.)ASP Classic 版本的 Server.MapPath 的工作方式是否与上述相同?和 (2.)我有一个安装在服务器中的 SSD 驱动器,它的驱动器号是“G:”网站在驱动器号“E:”上我希望 IMAGES 目录(也许还有其他目录)驻留在 G: 驱动器上(为了速度),但 Server.MapPath 在代码中使用时返回 E:。它已经是指向 E: 驱动器的虚拟目录。如果我将其指向 G: 驱动器,如何通知 Server.MapPath 将正确的驱动器号返回到 IMAGES 文件夹?
25赞 dav_i 7/12/2013 #2

只是为了稍微扩展一下@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(".")

4赞 Vaibhav_Welcomes_You 1/8/2018 #3

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

0赞 Aggie Jon of 87 8/1/2023 #4

工作示例,希望这有助于展示一种使用MapPath的方法,而不仅仅是“/”。我们将“/”和“~”组合在一起。

  1. 字符串 lotMapsUrl = “~/WebFS/Transport/Maps/Lots/”;---只需获得 将 URL 转换为变量
  2. 字符串 lotMapsDir = Server.MapPath(lotMapsUrl);---得到我们完整的 到此位置的物理路径
  3. string[] files = Directory.GetFiles(lotMapsUrl);---去拿一个清单 物理路径中的文件。