Pobieranie aktualnego katalogu w aplikacji internetowej .NET

105

Mam więc projekt sieci Web i próbuję uzyskać katalog główny witryny sieci Web przy użyciu metody C # Directory.GetCurrentDirectory(). Nie chcę używać ścieżki statycznej, ponieważ lokalizacje plików będą się zmieniać w przyszłości. Ta metoda działa w moim pliku imageProcess.aspx.cs, ale myślałem, że zwróci:

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

Zamiast tego otrzymuję:

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

Czy ktoś może wyjaśnić, dlaczego tak się dzieje i jakie może być możliwe rozwiązanie? Wielkie dzięki.

Julian Coltea
źródło
Powiązany post , który mówi ogólnie o ścieżkach wykonywania aplikacji .Net.
RBT

Odpowiedzi:

211

Bieżący katalog jest funkcją na poziomie systemu; zwraca katalog, z którego został uruchomiony serwer. Nie ma to nic wspólnego ze stroną internetową.

Chcesz HttpRuntime.AppDomainAppPath.

Jeśli jesteś w żądaniu HTTP, możesz również zadzwonić Server.MapPath("~/Whatever").

SLaks
źródło
2
Dzięki. Właściwie szukałem HttpRuntime.BinDirectory, ale było to łatwe do ustalenia w debugerze, gdy wypróbowałem to, o czym wspomniałeś w swojej odpowiedzi.
Kent Weigel
Jeśli używam `Server.MapPath (" ~ Cokolwiek "), a witryna IIS jest hostowana na serwerze myserver . Otrzymuję folder C: \\ somefolder \ Cokolwiek, zamiast folderu myserver / Cokolwiek .
Si8
@ Si8: Tak; to właśnie Server.MapPathrobi. Chcesz stackoverflow.com/q/5823847/34397
SLaks
2
W przypadku, gdy nie jesteś zaznajomiony z zespołami .NET (lub jesteś w bezpośrednim oknie), pełne polecenia to System.Web.HttpRuntime.AppDomainAppPathiSystem.Web.HttpRuntime.HttpContext.Server.MapPath("~")
testpattern
2
@testpattern HttpContextis System.Web.HttpContext.Current.Server.MapPath("~"), not haveHttpRuntime
chengzi
112

Użyj tego kodu:

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

Szczegółowe odniesienie:

Server.MapPath określa ścieżkę względną lub wirtualną do zamapowania na katalog fizyczny.

  • Server.MapPath(".") zwraca bieżący katalog fizyczny wykonywanego pliku (np. aspx)
  • Server.MapPath("..") zwraca katalog nadrzędny
  • Server.MapPath("~") zwraca ścieżkę fizyczną do katalogu głównego aplikacji
  • Server.MapPath("/") zwraca fizyczną ścieżkę do katalogu głównego nazwy domeny (niekoniecznie jest taka sama jak katalog główny aplikacji)

Przykład:

Załóżmy, że wskazałeś aplikację witryny internetowej ( http://www.example.com/ ) do

C:\Inetpub\wwwroot

i zainstalowałeś aplikację sklepu (podsieć jako katalog wirtualny w usługach IIS, oznaczoną jako aplikacja) w

D:\WebApps\shop

Na przykład, jeśli zadzwonisz Server.MapPathw następującym żądaniu:

http://www.example.com/shop/products/GetProduct.aspx?id=2342

następnie:

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

Jeśli Path zaczyna się od forward (/) lub backward slash (), MapPathmetoda zwraca ścieżkę tak, jakby Path była pełną, wirtualną ścieżką.

Jeśli Path nie zaczyna się od ukośnika, MapPathmetoda zwraca ścieżkę względem katalogu przetwarzanego żądania.

Uwaga: w języku C # @ jest dosłownym operatorem ciągu znaków, co oznacza, że ​​ciąg powinien być używany „tak jak jest” i nie może być przetwarzany dla sekwencji ucieczki.

Przypisy

Server.MapPath(null)i Server.MapPath("")spowoduje również ten efekt.

Harshal Doshi Jain
źródło
17
Doskonała kopia stackoverflow.com/questions/275781/ ...
GGO
3
@GGO Dobry link! Podążając za linkami, skończyłem System.Web.Hosting.HostingEnvironment.MapPath("~")zamiast tego, co działa świetnie, bez zależności odSystem.Web.HttpContext.Current
Max Barraclough