Server.MapPath («.»), Server.MapPath («~»), Server.MapPath (@ «\»), Server.MapPath («/»). В чем разница?

386

Может ли кто-нибудь объяснить разницу между Server.MapPath("."), Server.MapPath("~"), Server.MapPath(@"\") и Server.MapPath("/")?

Теги:
directory
mapping
path
filesystems

2 ответа

749
Лучший ответ

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-последовательностей.

Сноска

  • 44
    Отлично. Мы боролись с Server.Bloody.MapPath. Спасибо
  • 26
    Вам будет лучше использовать HostingEnvironment.MapPath как для этого не требуется HttpContext : stackoverflow.com/q/944219/3205
19

Просто чтобы увеличить на @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(".")

Ещё вопросы

Сообщество Overcoder
Наверх
Меню