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.
Odpowiedzi:
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")
.źródło
HttpRuntime.BinDirectory
, ale było to łatwe do ustalenia w debugerze, gdy wypróbowałem to, o czym wspomniałeś w swojej odpowiedzi.Server.MapPath
robi. Chcesz stackoverflow.com/q/5823847/34397System.Web.HttpRuntime.AppDomainAppPath
iSystem.Web.HttpRuntime.HttpContext.Server.MapPath("~")
HttpContext
isSystem.Web.HttpContext.Current.Server.MapPath("~")
, not haveHttpRuntime
Użyj tego kodu:
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ędnyServer.MapPath("~")
zwraca ścieżkę fizyczną do katalogu głównego aplikacjiServer.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
i zainstalowałeś aplikację sklepu (podsieć jako katalog wirtualny w usługach IIS, oznaczoną jako aplikacja) w
Na przykład, jeśli zadzwonisz
Server.MapPath
w następującym żądaniu:następnie:
Jeśli Path zaczyna się od forward (/) lub backward slash (),
MapPath
metoda zwraca ścieżkę tak, jakby Path była pełną, wirtualną ścieżką.Jeśli Path nie zaczyna się od ukośnika,
MapPath
metoda 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)
iServer.MapPath("")
spowoduje również ten efekt.źródło
System.Web.Hosting.HostingEnvironment.MapPath("~")
zamiast tego, co działa świetnie, bez zależności odSystem.Web.HttpContext.Current