Używanie Server.MapPath w zewnętrznych klasach C # w ASP.NET

132

Próbuję uzyskać bezwzględną ścieżkę niektórych plików w klasie C #. Server.MapPathdziała świetnie oczywiście dla ASPX i ich stron związanych z kodem, ale nie istnieje w innym pliku klas. Próbowałem HostingEnvironment.MapPath(), ale to narzeka, że ​​względna ścieżka wirtualna jest niedozwolona. jakieś pomysły?

System.Web jest już zaimportowany.

Chet
źródło

Odpowiedzi:

306

ServerUtilityKlasa jest dostępna jako przykład w twojej HttpContext. Jeśli jesteś w środowisku, w którym wiesz, że zostanie wykonany w potoku ASP.Net, możesz użyć

HttpContext.Current.Server.MapPath()

Musisz jednak zaimportować System.Web.

womp
źródło
1
Mimo że ten post ma ponad 2 lata, bardzo mi pomogłeś. Dzięki.
iarwain01
6
A jeśli nie zostanie wykonana w tym potoku?
zaitsman
Jeśli nie wykonujesz wewnątrz ASP.Net, jest mało prawdopodobne, że Twój HttpContext jest ustawiany, chyba że napisałeś własny potok :) Będziesz musiał polegać na metodach, które zapewnia Twój kontekst wykonania (router?). Jeśli Twój proces ma wgląd w podstawy routingu ścieżki, możesz przyjrzeć się metodom System.IO.Path.
womp
Ten skompilowany, ale kontekst jest null poza kontrolerami, więc moje błędy kodu. Myślę, że womp mówi tam to samo. Jeśli tak jest, czy możesz uzyskać dostęp do MapPath poza routerami?
edencorbin
34

możesz także 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ępny

Yakir Manor
źródło
8

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

Edycja: Obecnie polecam użycie HostingEnvironment.MapPathmetody :

Jest to statyczna metoda System.Webmontażu, która mapuje wirtualną ścieżkę na ścieżkę fizyczną na serwerze. To nie wymagać odniesienia do HttpContext.

Dan Diplo
źródło
Nie na zajęciach zewnętrznych.
funwhilelost
Oczywiście, możesz dodać odwołanie do klasy zewnętrznej; ale oczywiście musisz go użyć w kontekście żądania serwera, więc HttpContext nie jest null.
Dan Diplo,
4
System.Reflection.Assembly.GetAssembly(type).Location

JEŚLI plik, który próbujesz pobrać, jest lokalizacją zespołu dla typu. Ale jeśli pliki są względne w stosunku do lokalizacji zestawu, możesz użyć tego z System.IOprzestrzenią nazw, aby uzyskać dokładną ścieżkę do pliku.

David McEwing
źródło
-1: Co sprawiło, że uwierzyłeś, że chciał lokalizacji zgromadzenia?
John Saunders
1
Powiedział, że „niektóre pliki” nie określił lokalizacji ani charakteru plików, dlatego znajomość lokalizacji zespołu i możliwość pracy w odniesieniu do tej ścieżki mogą być pomocne. Oczywiście, gdyby rzeczywiście stwierdził, że nadal jest w HttpContext, nie zawracałbym sobie głowy odpowiedzią.
David McEwing,
David McEwing, to, co sugerujesz, nie zadziała, ponieważ usługi IIS nie ładują zestawów z lokalizacji, w której je instalujesz, w witrynie sieci Web. Są one kopiowane i ładowane z tymczasowej lokalizacji pamięci podręcznej asp.net, więc wykonanie GetAssembly lub GetExecutingAssembly wskaże Ci lokalizację zestawu, ale nie ma to nic wspólnego z lokalizacją witryny sieci Web, na którą wskazuje MapPath.
zumalifeguard
4

Ja też tego używam:

System.Web.HTTPContext.Current.Server.MapPath
tak niezwykłe
źródło
3
class test
{
public static void useServerPath(string path)
{
   if (File.Exists(path)
{
 \\...... do whatever you wabt
}
else
{
\\.....
}
}

Teraz, gdy wywołasz metodę z pliku codebehind

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 twój kod jest zbyt prosty i jedną metodą możesz używać wielu ścieżek dla każdego wywołania :)

Ahmad
źródło
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);
użytkownik sieci
źródło
Witamy w stackoverflow. Nieco więcej wyjaśnień pomogłoby innym programistom zrozumieć, dlaczego rozwiązanie zadziałało.
NJInamdar
1

Niezależnie od tego, czy działasz w kontekście ASP.NET, czy nie, powinieneś móc korzystać z HostingEnvironment.ApplicationPhysicalPath

daudihus
źródło
0

Plik server.mappath („”) będzie działał na stronie aspx, jeśli chcesz uzyskać bezwzględną ścieżkę z pliku klasy, musisz użyć tego-

HttpContext.Current.Server.MapPath("~/EmailLogic/RegistrationTemplate.html")
Debendra Dash
źródło