Obtenir le répertoire actuel dans l'application Web .NET

105

J'ai donc un projet Web et j'essaie d'obtenir le répertoire racine du site Web en utilisant la méthode c # Directory.GetCurrentDirectory(). Je ne veux pas utiliser de chemin statique car les emplacements des fichiers changeront à l'avenir. Cette méthode s'exécute dans mon fichier imageProcess.aspx.cs, mais là où je pensais qu'elle reviendrait:

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

Je reçois à la place:

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

Quelqu'un peut-il expliquer pourquoi cela se produit et quelle pourrait être une solution possible? Merci beaucoup.

Julian Coltea
la source
Article connexe ici qui parle des chemins d'exécution des applications .Net en général.
RBT du

Réponses:

211

Le répertoire actuel est une fonctionnalité au niveau du système; il renvoie le répertoire à partir duquel le serveur a été lancé. Cela n'a rien à voir avec le site Web.

Tu veux HttpRuntime.AppDomainAppPath.

Si vous êtes dans une requête HTTP, vous pouvez également appeler Server.MapPath("~/Whatever").

SLaks
la source
2
Merci. Je cherchais en fait HttpRuntime.BinDirectory, mais c'était facile à déterminer dans le débogueur, une fois que j'ai essayé ce que vous avez mentionné dans votre réponse.
Kent Weigel
Si j'utilise `Server.MapPath (" ~ Whatever ") et que le site IIS est hébergé sur myserver . J'obtiens un dossier C: \\ somefolder \ Whatever, plutôt que myserver / Whatever .
Si8
@ Si8: Oui; c'est ce que Server.MapPathfait. Vous voulez stackoverflow.com/q/5823847/34397
SLaks
2
Si vous n'êtes pas familier avec les assemblys .NET (ou êtes dans la fenêtre immédiate), les commandes complètes sont System.Web.HttpRuntime.AppDomainAppPathetSystem.Web.HttpRuntime.HttpContext.Server.MapPath("~")
testpattern
2
@testpattern HttpContextis System.Web.HttpContext.Current.Server.MapPath("~"), not haveHttpRuntime
chengzi
112

Utilisez ce code:

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

Référence détaillée:

Server.MapPath spécifie le chemin d'accès relatif ou virtuel à mapper vers un répertoire physique.

  • Server.MapPath(".") renvoie le répertoire physique actuel du fichier (par exemple aspx) en cours d'exécution
  • Server.MapPath("..") renvoie le répertoire parent
  • Server.MapPath("~") renvoie le chemin physique vers la racine de l'application
  • Server.MapPath("/") renvoie le chemin physique vers la racine du nom de domaine (n'est pas nécessairement le même que la racine de l'application)

Un exemple:

Supposons que vous ayez dirigé une application de site Web ( http://www.example.com/ ) vers

C:\Inetpub\wwwroot

et installé votre application de boutique (sous-site Web comme répertoire virtuel dans IIS, marqué comme application) dans

D:\WebApps\shop

Par exemple, si vous appelez Server.MapPathdans la demande suivante:

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

puis:

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

Si Path commence par une barre oblique avant (/) ou arrière (), la MapPathméthode renvoie un chemin comme si Path était un chemin virtuel complet.

Si Path ne commence pas par une barre oblique, la MapPathméthode retourne un chemin relatif au répertoire de la requête en cours de traitement.

Remarque: en C #, @ est l'opérateur de chaîne littérale verbatim signifiant que la chaîne doit être utilisée "telle quelle" et ne pas être traitée pour les séquences d'échappement.

Notes de bas de page

Server.MapPath(null)et Server.MapPath("")produira également cet effet.

Harshal Doshi Jain
la source
17
Copie parfaite de stackoverflow.com/questions/275781/…
GGO
3
@GGO Bon lien! En suivant les liens, j'ai fini par faire à la System.Web.Hosting.HostingEnvironment.MapPath("~")place, ce qui fonctionne très bien, sans dépendre deSystem.Web.HttpContext.Current
Max Barraclough