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.

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.


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


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.


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.


-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


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 :)


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);

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


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")
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.