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.