Получение текущего каталога в веб-приложении .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

Ответы:

211

Текущий каталог является функцией системного уровня; он возвращает каталог, из которого был запущен сервер. Это не имеет ничего общего с сайтом.

Вы хотите HttpRuntime.AppDomainAppPath.

Если вы используете HTTP-запрос, вы также можете позвонить Server.MapPath("~/Whatever").

SLaks
источник
2
Спасибо. Я действительно искал HttpRuntime.BinDirectory, но это было легко определить в отладчике, как только я попробовал то, что вы упомянули в своем ответе.
Кент Вайгель
Если я использую `Server.MapPath (" ~ Что угодно "), а сайт IIS размещен на моем сервере . Я получаю папку C: \\ somefolder \ Whatever, а не папку myserver / Whatever .
Si8
@ Si8: Да; вот что Server.MapPathделает. Вам нужен stackoverflow.com/q/5823847/34397
SLaks 06
2
Если вы не знакомы со сборками .NET (или находитесь в непосредственном окне), полные команды: System.Web.HttpRuntime.AppDomainAppPathиSystem.Web.HttpRuntime.HttpContext.Server.MapPath("~")
testpattern
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 был полным виртуальным путем.

Если Path не начинается с косой черты, MapPathметод возвращает путь относительно каталога обрабатываемого запроса.

Примечание. В C # @ - это буквальный строковый оператор, означающий, что строка должна использоваться «как есть» и не обрабатываться для управляющих последовательностей.

Сноски

Server.MapPath(null)и Server.MapPath("")будет производить такой же эффект.

Харшал Доши Джайн
источник
17
Идеальная копия stackoverflow.com/questions/275781/…
GGO
3
@GGO Хорошая ссылка! Перейдя по ссылкам, я остановился на этом System.Web.Hosting.HostingEnvironment.MapPath("~"), что отлично работает, независимо отSystem.Web.HttpContext.Current
Макс Барраклаф