Utilizzo di Server.MapPath in classi C # esterne in ASP.NET


132

Sto cercando di ottenere il percorso assoluto di alcuni file in una classe C #. Server.MapPathfunziona perfettamente per ASPX e le loro pagine code-behind, ma questo non esiste in un altro file di classe. Ho provato HostingEnvironment.MapPath(), ma ciò si lamenta che il relativo percorso virtuale non è consentito. qualche idea?

System.Web è già importato.

Risposte:


302

La ServerUtilityclasse è disponibile come istanza nel tuo HttpContext. Se ti trovi in ​​un ambiente in cui sai che verrà eseguito all'interno della pipeline ASP.Net, puoi usarlo

HttpContext.Current.Server.MapPath()

Dovrai System.Webcomunque importare .


1
Anche se questo post ha più di 2 anni, mi hai aiutato moltissimo. Grazie.
iarwain01,

6
E se non fosse eseguito in quella pipeline?
zaitsman,

Se non stai eseguendo all'interno di ASP.Net, è improbabile che il tuo HttpContext sia impostato, a meno che tu non abbia scritto la tua pipeline :) Dovrai fare affidamento su tutti i metodi forniti dal tuo contesto di esecuzione (router?). Se il tuo processo ha una visione delle basi del tuo percorso, puoi dare un'occhiata ai metodi System.IO.Path.
womp

Questo contesto compilato ma è nullo al di fuori dei controller, quindi i miei errori di codice. Penso che Womp stia dicendo la stessa cosa lì. In tal caso, puoi accedere a MapPath al di fuori dei router?
edencorbin,

34

puoi anche usare:

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

Se

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

è inaccessibile


8

Non puoi semplicemente aggiungere un riferimento a System.Webe quindi puoi usare Server.MapPath?

Modifica: oggi consiglierei di utilizzare il HostingEnvironment.MapPathmetodo :

È un metodo statico System.Webnell'assemblaggio che mappa un percorso virtuale su un percorso fisico sul server. Esso non richiede un riferimento a HttpContext.


Non in classi esterne.
funwhilelost

Sicuro che puoi aggiungere il riferimento a una classe esterna; ma ovviamente è necessario utilizzarlo nel contesto di una richiesta del server, quindi HttpContext non è nullo.
Dan Diplo,

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

SE il file che si sta tentando di ottenere è la posizione dell'assembly per un tipo. Ma se i file sono relativi alla posizione dell'assembly, è possibile utilizzarlo con System.IOnamespace per ottenere il percorso esatto del file.


-1: Cosa ti ha portato a credere che volesse la posizione di un'assemblea?
John Saunders,

1
Ha detto che "alcuni file" non ha specificato la posizione o la natura dei file, quindi conoscere la posizione dell'assembly e poter lavorare in relazione a quel percorso può essere utile. Naturalmente se avesse effettivamente dichiarato di essere ancora in un HttpContext, non mi sarei preso la briga di rispondere.
David McEwing,

David McEwing, ciò che suggerisci non funzionerà perché IIS non carica gli assembly dalla posizione in cui li installi, nel sito web. Vengono copiati e caricati da una posizione temporanea della cache asp.net, quindi fare un GetAssembly o GetExecutingAssembly ti indicherà la posizione dell'assembly, ma non avrebbe nulla a che fare con la posizione del sito Web a cui punta MapPath.
zumalifeguard


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

Ora quando chiami il metodo da codebehind

per esempio :

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

            test.useServerPath(path);
}

in questo modo il tuo codice è semplice e con un metodo puoi usare più percorsi per ogni chiamata :)


3

Questo mi ha aiutato

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

Benvenuto in StackOverflow. Qualche spiegazione in più aiuterebbe gli altri programmatori a capire perché la soluzione ha funzionato.
NJInamdar,

1

Che tu stia eseguendo o meno nel contesto di ASP.NET, dovresti essere in grado di utilizzare HostingEnvironment.ApplicationPhysicalPath


0

Server.mappath ("") funzionerà sulla pagina aspx, se vuoi ottenere il percorso assoluto da un file di classe devi usare questo-

HttpContext.Current.Server.MapPath("~/EmailLogic/RegistrationTemplate.html")
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.