2012-06-08 18 views
78

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

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

ja zamiast się:

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

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

+0

Powiązany post [tutaj] (https://stackoverflow.com/q/6041332/465053), który mówi ogólnie o ścieżkach wykonywania aplikacji .Net. – RBT

+0

Kolejny post, który mówi o [ścieżkach map serwera w aplikacjach internetowych w .Net] (https://stackoverflow.com/q/275781/465053) – RBT

Odpowiedz

155

Aktualny katalog jest funkcją na poziomie systemu; zwraca katalog, z którego uruchomiono serwer. Nie ma nic wspólnego ze stroną internetową.

Chcesz HttpRuntime.AppDomainAppPath.

Jeśli korzystasz z żądania HTTP, możesz również zadzwonić pod numer Server.MapPath("~/Whatever").

+0

Dzięki. Właściwie szukałem 'HttpRuntime.BinDirectory', ale to było łatwe do ustalenia w debugerze, kiedy spróbowałem tego, co wspomniałeś w swojej odpowiedzi. –

+0

Jeśli używam 'Server.MapPath (" ~ Any whatever ") a witryna IIS jest hostowana w http: // myserver. Dostaję folder C: \\ somefolder \ Cokolwiek, a nie http: // mójserwer/Cokolwiek. – Si8

+0

@ Si8: Tak; właśnie to robi 'Server.MapPath'. Chcesz http://stackoverflow.com/q/5823847/34397 – SLaks

71

użyć tego kodu:

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

Szczegółowe referencyjny:

Server.MapPath określa względną lub ścieżkę wirtualną do mapy do katalogu fizycznego.

  • Server.MapPath(".") zwraca bieżący katalog fizyczny pliku (np aspx) jest wykonywany
  • Server.MapPath("..") powraca katalogu nadrzędnego
  • Server.MapPath("~") powraca fizyczna ścieżka do katalogu głównego aplikacji
  • Server.MapPath("/") powraca fizyczna ścieżka do katalogu głównego nazwy domeny (niekoniecznie taka sama jak główna z aplikacji )

Przykład:

Powiedzmy wskazał aplikację stronie (http://www.example.com/) do

C:\Inetpub\wwwroot 

i instalowania aplikacji sklep (sub internetową jako katalogu wirtualnego w IIS, oznaczonej jako aplikacja) w

D:\WebApps\shop 

na przykład, jeśli zadzwonisz Server.MapPath w następujący wniosek:

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żeli ścieżka rozpoczyna się albo w prawo (/) lub ukośnik (wstecz), metoda MapPath zwraca ścieżkę jakby ścieżka były pełne, wirtualne ścieżki.

Jeśli Ścieżka nie rozpoczyna się ukośnikiem, metoda MapPath zwraca ścieżkę względem katalogu przetwarzanego żądania.

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

Przypisy

Server.MapPath(null) i Server.MapPath("") będzie produkować ten efekt zbyt.

+0

Idealnie! Właśnie to, czego szukałem ... –

+4

Doskonała kopia https://stackoverflow.com/questions/275781/server-mappath-server-mappath-server-mappath-server-mappath#275791 – GGO