2009-07-27 23 views
118

Sto cercando di ottenere il percorso assoluto di determinati file in una classe C#. Server.MapPath funziona perfettamente per ASPX e le relative pagine code-behind, ma questo non esiste in un altro file di classe. Ho provato HostingEnvironment.MapPath(), ma questo lamenta che il percorso virtuale relativo non è consentito. qualche idea?Utilizzo di Server.MapPath nelle classi C# esterne in ASP.NET

System.Web è già importato.

risposta

266

La classe ServerUtility è disponibile come istanza nello HttpContext. Se ti trovi in ​​un ambiente in cui si sa che sarà eseguito all'interno della pipeline di ASP.Net, è possibile utilizzare

HttpContext.Current.Server.MapPath() 

Dovrete importare System.Web però.

+1

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

+6

Cosa succede se non viene eseguito in quella pipeline? – zaitsman

+0

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 qualunque metodo fornisca il contesto di esecuzione (router?).Se il tuo processo ha approfondimenti sulle basi del tuo percorso di routing, puoi dare un'occhiata ai metodi System.IO.Path. – womp

8

Non è sufficiente aggiungere un riferimento a System.Web e quindi è possibile utilizzare Server.MapPath?

Edit: Oggi mi consiglia di utilizzare l'HostingEnvironment.MapPath Method:

Si tratta di un metodo statico in System.Web assemblaggio che le mappe di un percorso virtuale a un percorso fisico sul server. È non richiedere un riferimento a HttpContext.

+0

Non in classi esterne. – funwhilelost

+0

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

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

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

+0

-1: cosa ti ha portato a credere che volesse l'ubicazione di un'assemblea? –

+1

Ha detto "determinati file" non ha specificato la posizione o la natura dei file, quindi conoscere la posizione dell'assembly e poter lavorare relativamente a quel percorso può essere utile. Ovviamente se affermasse di essere ancora in un HttpContext, non mi sarei preoccupato di rispondere. –

+0

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

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

Ora, quando si chiama il metodo dal codebehind

ad esempio:

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

      test.useServerPath(path); 
} 

in questo modo il codice è quello semplice e con un metodo u possibile utilizzare il percorso multiplo per ogni chiamata :)

3

io uso anche questo:

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

è anche possibile utilizzare:

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

3

Questo ha aiutato per me

//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

Benvenuti in StackOverflow. Qualche altra spiegazione potrebbe aiutare i colleghi programmatori a capire perché la soluzione ha funzionato. – Daenarys

1

Sia che si sta eseguendo nel contesto di ASP .NET o no, dovresti essere in grado di utilizzare HostingEnvironment.ApplicationP hysicalPath