Recupero della directory corrente nell'applicazione web .NET


105

Quindi ho un progetto web e sto cercando di ottenere la directory principale del sito web usando il metodo c # Directory.GetCurrentDirectory(). Non voglio utilizzare un percorso statico poiché le posizioni dei file cambieranno in futuro. Questo metodo è in esecuzione nel mio file imageProcess.aspx.cs, ma dove pensavo sarebbe tornato:

C:\Users\tcbl\documents\visual studio 2010\Projects\ModelMonitoring\ModelMonitoring\imageProcess.aspx.cs

Sto invece ottenendo:

C:\Program Files\Common Files\Microsoft Shared\DevServer\10.0\

Qualcuno può spiegare perché questo sta accadendo e quale potrebbe essere una possibile soluzione? Molte grazie.


Post correlato qui che parla dei percorsi di esecuzione delle applicazioni .Net in generale.
RBT

Risposte:


210

La directory corrente è una funzionalità a livello di sistema; restituisce la directory da cui è stato avviato il server. Non ha niente a che fare con il sito web.

Tu vuoi HttpRuntime.AppDomainAppPath.

Se ti trovi in ​​una richiesta HTTP, puoi anche chiamare Server.MapPath("~/Whatever").


2
Grazie. In realtà stavo cercando HttpRuntime.BinDirectory, ma è stato facile determinarlo nel debugger, una volta provato ciò che hai menzionato nella tua risposta.
Kent Weigel

Se uso `Server.MapPath (" ~ Wutely ") e il sito IIS è ospitato in myserver . Ottengo un C: \\ somefolder \ Qualunque, piuttosto che il server / Qualunque cartella.
Si8

@ Si8: Sì; questo è ciò che Server.MapPathfa. Si vuole stackoverflow.com/q/5823847/34397
SLaks

2
Nel caso in cui non si abbia familiarità con gli assembly .NET (o si trovi nella finestra immediata), i comandi completi sono System.Web.HttpRuntime.AppDomainAppPatheSystem.Web.HttpRuntime.HttpContext.Server.MapPath("~")
testpattern

2
@testpattern HttpContextis System.Web.HttpContext.Current.Server.MapPath("~"), not haveHttpRuntime
chengzi

112

Usa questo codice:

 HttpContext.Current.Server.MapPath("~")

Riferimento dettagliato:

Server.MapPath specifica il percorso relativo o virtuale da mappare a una directory fisica.

  • Server.MapPath(".") restituisce la directory fisica corrente del file (es. aspx) in esecuzione
  • Server.MapPath("..") restituisce la directory padre
  • Server.MapPath("~") restituisce il percorso fisico alla radice dell'applicazione
  • Server.MapPath("/") restituisce il percorso fisico alla radice del nome di dominio (non è necessariamente uguale alla radice dell'applicazione)

Un esempio:

Supponiamo che tu abbia indirizzato un'applicazione del sito web ( http://www.example.com/ ) a

C:\Inetpub\wwwroot

e installato l'applicazione del negozio (sub web come directory virtuale in IIS, contrassegnata come applicazione) in

D:\WebApps\shop

Ad esempio, se chiami la Server.MapPathseguente richiesta:

http://www.example.com/shop/products/GetProduct.aspx?id=2342

poi:

Server.MapPath(".") returns D:\WebApps\shop\products
Server.MapPath("..") returns D:\WebApps\shop
Server.MapPath("~") returns D:\WebApps\shop
Server.MapPath("/") returns C:\Inetpub\wwwroot
Server.MapPath("/shop") returns D:\WebApps\shop

Se Path inizia con una barra in avanti (/) o all'indietro (), il MapPathmetodo restituisce un percorso come se Path fosse un percorso virtuale completo.

Se Path non inizia con una barra, il MapPathmetodo restituisce un percorso relativo alla directory della richiesta in fase di elaborazione.

Nota: in C #, @ è l'operatore di stringa letterale verbatim che significa che la stringa deve essere utilizzata "così com'è" e non deve essere elaborata per le sequenze di escape.

Le note

Server.MapPath(null)e Server.MapPath("")produrrà anche questo effetto.



3
@GGO Buon collegamento! Seguendo i link, ho finito per fare System.Web.Hosting.HostingEnvironment.MapPath("~")invece, che funziona alla grande, senza alcuna dipendenza daSystem.Web.HttpContext.Current
Max Barraclough
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.