Abrufen des aktuellen Verzeichnisses in der .NET-Webanwendung

105

Ich habe also ein Webprojekt und versuche, das Stammverzeichnis der Website mithilfe der c # -Methode abzurufen Directory.GetCurrentDirectory(). Ich möchte keinen statischen Pfad verwenden, da sich die Speicherorte der Dateien in Zukunft ändern werden. Diese Methode wird in meiner Datei imageProcess.aspx.cs ausgeführt, aber wo ich dachte, dass sie zurückkehren würde:

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

Ich bekomme stattdessen:

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

Kann jemand erklären, warum dies geschieht und was eine mögliche Lösung sein könnte? Vielen Dank.

Julian Coltea
quelle
In Verbindung stehender Beitrag hier, der über Ausführungspfade von .NET-Anwendungen im Allgemeinen spricht.
RBT
Ein weiterer Beitrag, der über Serverzuordnungspfade in Webanwendungen in .Net
RBT

Antworten:

210

Das aktuelle Verzeichnis ist eine Funktion auf Systemebene. Es gibt das Verzeichnis zurück, aus dem der Server gestartet wurde. Es hat nichts mit der Website zu tun.

Du willst HttpRuntime.AppDomainAppPath.

Wenn Sie sich in einer HTTP-Anfrage befinden, können Sie auch anrufen Server.MapPath("~/Whatever").

SLaks
quelle
2
Vielen Dank. Ich habe tatsächlich gesucht HttpRuntime.BinDirectory, aber das war im Debugger leicht festzustellen, als ich versuchte, was Sie in Ihrer Antwort erwähnt haben.
Kent Weigel
Wenn ich `Server.MapPath (" ~ Whatever ") verwende und die IIS-Site in myserver gehostet wird . Ich erhalte einen C: \\ somefolder \ Whatever und nicht myserver / Whatever- Ordner.
Si8
@ Si8: Ja; das ist was Server.MapPathmacht. Sie wollen stackoverflow.com/q/5823847/34397
SLaks
2
Falls Sie mit .NET-Assemblys nicht vertraut sind (oder sich im System.Web.HttpRuntime.AppDomainAppPathSystem.Web.HttpRuntime.HttpContext.Server.MapPath("~")
Direktfenster
2
@ Testpattern HttpContextist System.Web.HttpContext.Current.Server.MapPath("~"), nicht habenHttpRuntime
Chengzi
112

Verwenden Sie diesen Code:

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

Detaillierte Referenz:

Server.MapPath Gibt den relativen oder virtuellen Pfad an, der einem physischen Verzeichnis zugeordnet werden soll.

  • Server.MapPath(".") Gibt das aktuelle physische Verzeichnis der ausgeführten Datei (z. B. aspx) zurück
  • Server.MapPath("..") Gibt das übergeordnete Verzeichnis zurück
  • Server.MapPath("~") Gibt den physischen Pfad zum Stammverzeichnis der Anwendung zurück
  • Server.MapPath("/") Gibt den physischen Pfad zum Stammverzeichnis des Domänennamens zurück (muss nicht unbedingt mit dem Stammverzeichnis der Anwendung identisch sein).

Ein Beispiel:

Angenommen, Sie haben auf eine Website-Anwendung ( http://www.example.com/ ) verwiesen

C:\Inetpub\wwwroot

und installierte Ihre Shop-Anwendung (Sub-Web als virtuelles Verzeichnis in IIS, als Anwendung markiert) in

D:\WebApps\shop

Zum Beispiel, wenn Sie Server.MapPathfolgende Anfrage anrufen :

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

dann:

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

Wenn Path entweder mit einem Schrägstrich vorwärts (/) oder rückwärts () beginnt, gibt die MapPathMethode einen Pfad zurück, als wäre Path ein vollständiger virtueller Pfad.

Wenn Path nicht mit einem Schrägstrich beginnt, gibt die MapPathMethode einen Pfad relativ zum Verzeichnis der zu verarbeitenden Anforderung zurück.

Hinweis: In C # ist @ der wörtliche wörtliche Zeichenfolgenoperator. Dies bedeutet, dass die Zeichenfolge "wie sie ist" verwendet und nicht für Escape-Sequenzen verarbeitet werden sollte.

Fußnoten

Server.MapPath(null)und Server.MapPath("")wird diesen Effekt auch erzeugen.

Harshal Doshi Jain
quelle
17
Perfekte Kopie von stackoverflow.com/questions/275781/…
GGO
3
@GGO Guter Link! Den Links folgend, habe ich System.Web.Hosting.HostingEnvironment.MapPath("~")stattdessen getan , was großartig funktioniert, ohne Abhängigkeit vonSystem.Web.HttpContext.Current
Max Barraclough