2009-07-27 8 views
118

Próbuję uzyskać bezwzględną ścieżkę niektórych plików w klasie C#. Server.MapPath działa świetnie oczywiście dla ASPX i ich stron kodowych, ale to nie istnieje w innym pliku klasy. Próbowałem HostingEnvironment.MapPath(), ale to narzeka, że ​​względna ścieżka wirtualna nie jest dozwolona. jakieś pomysły?Używanie Server.MapPath w zewnętrznych klasach C# w ASP.NET

System.Web jest już zaimportowany.

Odpowiedz

266

Klasa ServerUtility jest dostępna jako egzemplarz w urządzeniu HttpContext. Jeśli jesteś w środowisku, w którym wiesz, że to być wykonywane wewnątrz rurociągu ASP.NET, można użyć

HttpContext.Current.Server.MapPath() 

Będziesz musiał importować System.Web chociaż.

+1

Mimo że ten post ma więcej niż 2 lata, bardzo mi pomógł. Dzięki. – iarwain01

+6

Co się stanie, jeśli nie zostanie wykonany w tym potoku? – zaitsman

+0

Jeśli nie wykonujesz wewnątrz ASP.Net, to jest mało prawdopodobne, że twój HttpContext jest ustawiony, chyba że napisałeś własny potok :) Będziesz musiał polegać na dowolnych metodach, które zapewnia kontekst wykonania (router?).Jeśli twój proces ma wgląd w podstawy routingu ścieżek, zapoznaj się z metodami System.IO.Path. – womp

8

Nie możesz po prostu dodać odniesienia do System.Web, a następnie można użyć Server.MapPath?

Edit: Teraz polecam używając HostingEnvironment.MapPath Method:

Jest to metoda statyczna w System.Web zespół, który mapuje ścieżki wirtualnej do fizycznego ścieżki na serwerze. To nie wymaga wymaga odniesienia do HttpContext.

+0

Nie w klasach zewnętrznych. – funwhilelost

+0

Oczywiście możesz dodać odwołanie do zewnętrznej klasy; ale oczywiście musisz go użyć w kontekście żądania serwera, więc HttpContext nie ma wartości null. –

4
System.Reflection.Assembly.GetAssembly(type).Location 

JEŻELI plik, który próbujesz zdobyć, jest miejscem montażu dla typu. Ale jeśli pliki są względne w stosunku do miejsca montażu, możesz użyć tego w przestrzeni nazw System.IO, aby uzyskać dokładną ścieżkę do pliku.

+0

-1: Co doprowadziło cię do przekonania, że ​​chciałby umiejscowić zgromadzenie? –

+1

Powiedział "pewne pliki", że nie określił położenia ani charakteru plików, dlatego znajomość lokalizacji zespołu i możliwość pracy względem tej ścieżki może być pomocna. Oczywiście, gdyby rzeczywiście stwierdził, że wciąż znajduje się w HttpContext, to nie bałem się odpowiadać. –

+0

David McEwing, co sugerujesz, nie będzie działać, ponieważ IIS nie ładuje zespołów z lokalizacji, w której je instalujesz, na stronie internetowej. Są one kopiowane i ładowane z tymczasowej lokalizacji pamięci podręcznej asp.net, więc wykonanie funkcji GetAssembly lub GetExecutingAssembly spowoduje wskazanie lokalizacji złożenia, ale nie ma to nic wspólnego z lokalizacją strony internetowej, do której wskazuje punkt MapPath. – zumalifeguard

2
class test 
{ 
public static void useServerPath(string path) 
{ 
    if (File.Exists(path) 
{ 
\\...... do whatever you wabt 
} 
else 
{ 
\\..... 
} 
} 

Teraz, kiedy wywołać metodę z kodzie

na przykład:

protected void BtAtualizacao_Click(object sender, EventArgs e) 
     { 
      string path = Server.MapPath("Folder") + "\\anifile.txt"; 

      test.useServerPath(path); 
} 

w ten sposób kod jest proste i jedną metodę można korzystać z wielu ścieżki dla każdego połączenia :)

3

używam tego też:

System.Web.HTTPContext.Current.Server.MapPath 
30

można również użyć:

var path = System.Web.Hosting.HostingEnvironment.MapPath("~/App_Data/myfile.txt") 

jeśli

var path = Server.MapPath("~/App_Data"); 
var fullpath = Path.Combine(path , "myfile.txt"); 

jest niedostępne

3

Ten pomógł mi

//System.Web.HttpContext.Current.Server.MapPath //   
FileStream fileStream = new FileStream(System.Web.HttpContext.Current.Server.MapPath("~/File.txt"), 
FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite); 
+0

Witamy w stackoverflow. Nieco więcej wyjaśnień pomogłoby innym programistom zrozumieć, dlaczego rozwiązanie się udało. – Daenarys

1

czy używasz w ramach ASP .NET lub nie, powinieneś być w stanie używać HostingEnvironment.ApplicationP hysicalPath