Может ли кто-нибудь объяснить разницу между Server.MapPath(".")
, Server.MapPath("~")
, Server.MapPath(@"\")
и Server.MapPath("/")
?
Server.MapPath( "." ), Server.MapPath( "~" ), Server.MapPath(@ "\" ), Server.MapPath( "/" ). В чем разница?
Ответ 1
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()
возвращает путь, как если бы путь был полным, виртуальным путем.
Если Путь не начинается с косой черты, MapPath()
возвращает путь относительно каталога обрабатываемого запроса.
Примечание: в С#, @
является оператором строковой строки, означающим, что строка должна использоваться как "как есть" и не обрабатываться для escape-последовательностей.
Сноска
-
Server.MapPath(null)
иServer.MapPath("")
будет производить этот эффект тоже.
Ответ 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(".")