Отримання поточного каталогу у веб-програмі .NET


105

Отже, у мене є веб-проект, і я намагаюся отримати кореневий каталог веб-сайту за допомогою методу c # Directory.GetCurrentDirectory(). Я не хочу використовувати статичний шлях, оскільки в майбутньому місця розташування файлів будуть змінюватися. Цей метод працює у моєму файлі imageProcess.aspx.cs, але там, де я думав, він повернеться:

C:\Users\tcbl\documents\visual studio 2010\Projects\ModelMonitoring\ModelMonitoring\imageProcess.aspx.cs

Я натомість отримую:

C:\Program Files\Common Files\Microsoft Shared\DevServer\10.0\

Хтось може пояснити, чому це відбувається і яке можливе рішення може бути? Дуже дякую.


Пов'язаний пост тут , який говорить про .Net шляхи виконання програми в цілому.
RBT

Ще одна публікація, в якій розповідається про шляхи до серверної карти у веб-додатках у .Net
RBT

Відповіді:


210

Поточний каталог є функцією на рівні системи; він повертає каталог, з якого був запущений сервер. Це не має нічого спільного з веб-сайтом.

Ти хочеш HttpRuntime.AppDomainAppPath.

Якщо у вас є запит HTTP, ви також можете зателефонувати Server.MapPath("~/Whatever").


2
Дякую. Я насправді шукав HttpRuntime.BinDirectory, але це було легко визначити у налагоджувачі, як тільки я спробував те, що ви згадали у своїй відповіді.
Кент Вайгель

Якщо я використовую `Server.MapPath (" ~ Що б там не було "), а сайт IIS розміщується в моєму сервері . Я отримую C: \\ деяку папку \ Що б там не було, ніж myserver / Що б там не було .
Si8

@ Si8: Так; ось що і Server.MapPathробить. Ви хочете stackoverflow.com/q/5823847/34397
SLaks

2
Якщо ви не знайомі зі збірками .NET (або перебуваєте в System.Web.HttpRuntime.AppDomainAppPathSystem.Web.HttpRuntime.HttpContext.Server.MapPath("~")
негайному

2
@testpattern HttpContextє System.Web.HttpContext.Current.Server.MapPath("~"), немаєHttpRuntime
chengzi

112

Використовуйте цей код:

 HttpContext.Current.Server.MapPath("~")

Детальна довідка:

Server.MapPath задає відносний чи віртуальний шлях для відображення у фізичний каталог.

  • Server.MapPath(".") повертає поточний фізичний каталог файлу (наприклад, 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(".") returns D:\WebApps\shop\products
Server.MapPath("..") returns D:\WebApps\shop
Server.MapPath("~") returns D:\WebApps\shop
Server.MapPath("/") returns C:\Inetpub\wwwroot
Server.MapPath("/shop") returns D:\WebApps\shop

Якщо Path починається з прямої (/) або зворотної косої риски (), MapPathметод повертає шлях так, як ніби Path був повним віртуальним шляхом.

Якщо шлях не починається з косою рисою, MapPathметод повертає шлях відносно каталогу запиту, який обробляється.

Примітка: у C #, @ - оператор дослівної лінійної рядкової лінії, що означає, що рядок повинен використовуватися "як є", а не оброблятися для послідовностей втечі.

Виноски

Server.MapPath(null)і Server.MapPath("")дасть цей ефект теж.


17
Ідеальна копія stackoverflow.com/questions/275781 / ...
ГГО

3
@GGO Гарне посилання! Перейшовши за посиланнями, я System.Web.Hosting.HostingEnvironment.MapPath("~")натомість робив натомість, що працює чудово, без залежностіSystem.Web.HttpContext.Current
Макс Барраклу
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.