Der beste Weg, um den Pfad des Anwendungsordners zu erhalten


515

Ich sehe, dass es einige Möglichkeiten gibt, den Pfad des Anwendungsordners abzurufen:

  1. Application.StartupPath
  2. System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().Location)
  3. AppDomain.CurrentDomain.BaseDirectory
  4. System.IO.Directory.GetCurrentDirectory()
  5. Environment.CurrentDirectory
  6. System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)
  7. System.IO.Path.GetDirectory(Application.ExecutablePath)

Was ist je nach Situation der beste Weg?


9
Warum wir viele Möglichkeiten haben, den Pfad der Anwendung zu ermitteln. Ich denke, es gibt einen Grund für jeden Weg.
Leo Vo

1
Es gibt einen Fehler in # 6: sollte lauten: System.Reflection.Assembly.GetExecutingAssembly (). GetName (). CodeBase), System.IO.Path.GetDirectoryName (Application.ExecutablePath)
BillW

2
Hurra für # 6, während ich in einem Webprojekt bin, wollte ich keine Server.MapPath-Logik in meiner IoC-geladenen Bibliothek, die nicht
webspezifisch ist

Wir haben jetzt die zuverlässige IHostEnvironment.ContentRootPath, Zugriff über eine injizierte IHostEnvironmentAbhängigkeit (die andere nützliche Dinge enthält).
Timo

Antworten:


519

AppDomain.CurrentDomain.BaseDirectory ist wahrscheinlich am nützlichsten für den Zugriff auf Dateien, deren Speicherort relativ zum Installationsverzeichnis der Anwendung ist.

In einer ASP.NET-Anwendung ist dies das Anwendungsstammverzeichnis, nicht der Unterordner bin - was wahrscheinlich das ist, was Sie normalerweise wollen. In einer Clientanwendung ist dies das Verzeichnis, das die ausführbare Hauptdatei enthält.

In einer VSTO 2005-Anwendung ist dies das Verzeichnis, das die von VSTO verwalteten Assemblys für Ihre Anwendung enthält, nicht beispielsweise der Pfad zur ausführbaren Excel-Datei.

Die anderen geben je nach Umgebung möglicherweise unterschiedliche Verzeichnisse zurück - siehe beispielsweise die Antwort von @ Vimvq1987.

CodeBaseist der Ort, an dem eine Datei gefunden wurde, und kann eine URL sein, die mit http: // beginnt. In diesem Fall Locationwird wahrscheinlich der Assembly-Download-Cache sein. Es ist nicht garantiert, dass CodeBase für Assemblys im GAC festgelegt wird .


2
Beim Testen unter Windows XP 32bit wird zurückgegeben, wo die Verknüpfung gestartet wurde.
Joshua Son

1
+1 @ Joe und für VSTO Dokumentebene Add-In sehen THIS

3
Beachten Sie, dass dies einen Pfad mit einem Backslash am Ende zurückgibt. Dies verursachte Probleme beim Formatieren einer Zeichenfolge mit dem Ergebnis, das als Prozessargument übergeben werden soll.
Avenmore

19
@avenmore - Wenn Sie eine Zeichenfolge formatieren, um einen Pfad zu erstellen, sollten Sie Path.Combinestattdessen verwenden. Dies wird den nachfolgenden Backslash für Sie erledigen.
Joe

1
Dies gibt für mich den Ordner bin / debug in VS 2017 zurück, nicht das Stammverzeichnis.
SmoveBB

86
  1. Application.StartupPathund 7. System.IO.Path.GetDirectoryName(Application.ExecutablePath)- Funktioniert nur für Windows Forms-Anwendungen

  2. System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().Location)

    Wird Ihnen etwas geben wie: "C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\Temporary ASP.NET Files\\legal-services\\e84f415e\\96c98009\\assembly\\dl3\\42aaba80\\bcf9fd83_4b63d101"Wo ist die Seite, die Sie laufen.

  3. AppDomain.CurrentDomain.BaseDirectoryfür Webanwendungen könnte nützlich sein und wird so etwas wie "C:\\hg\\Services\\Services\\Services.Website\\"das Basisverzeichnis zurückgeben und ist sehr nützlich.

  4. System.IO.Directory.GetCurrentDirectory() und 5. Environment.CurrentDirectory

Hier erfahren Sie, von wo aus der Prozess ausgelöst wurde - für Web-Apps, die im Debug-Modus von Visual Studio ausgeführt werden "C:\\Program Files (x86)\\IIS Express"

  1. System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)

Sie erhalten den Ort, an .dlldem der Code ausgeführt wird, für eine Web-App, die es sein könnte"file:\\C:\\hg\\Services\\Services\\Services.Website\\bin"

Im Fall von beispielsweise Konsolen-App sind die Punkte 2-6 das Verzeichnis, in dem sich die .exe Datei befindet.

Hoffe das spart dir etwas Zeit.


2
Ziemlich sicher, dass der "aktuelle Ordner" sowieso nur für Nicht-Web-Apps relevant ist ...
Nyerguds

2
Das ist die Antwort.
P.Brian.Mackey

59

Beachten Sie, dass nicht alle dieser Methoden denselben Wert zurückgeben. In einigen Fällen können sie denselben Wert zurückgeben, aber seien Sie vorsichtig, ihre Zwecke sind unterschiedlich:

Application.StartupPath

gibt den StartupPathParameter zurück (kann beim Ausführen der Anwendung festgelegt werden)

System.IO.Directory.GetCurrentDirectory()

Gibt das aktuelle Verzeichnis zurück, das möglicherweise der Ordner ist, in dem sich die Anwendung befindet. Das gilt auch für Environment.CurrentDirectory. Wenn Sie dies in einer DLL-Datei verwenden, wird der Pfad zurückgegeben, in dem der Prozess ausgeführt wird (dies gilt insbesondere für ASP.NET).


7
Bitte, bitte, bitte nicht benutzen GetCurrentDirectory(), aus Liebe, Dinge von verschiedenen Wegen zu laufen! :(
kayleeFrye_onDeck

@kayleeFrye_onDeck Sie haben Ihre Gründe für die vorherige Frage nicht angegeben.
nless

10

Um für eine Webanwendung das aktuelle Stammverzeichnis der Webanwendung abzurufen, rufen Sie im Allgemeinen per Webseite die aktuelle eingehende Anforderung auf:

HttpContext.Current.Server.MapPath();

System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;

Oben Codebeschreibung


6

Ich habe einen Prozess von einem Windows-Dienst über die Win32-API in der Sitzung von dem Benutzer gestartet, der tatsächlich angemeldet ist (in Task-Manager-Sitzung 1 nicht 0). Hier können wir herausfinden, welche Variable die beste ist.

Für alle 7 Fälle aus der obigen Frage sind die folgenden Ergebnisse:

Path1: C:\Program Files (x86)\MyProgram
Path2: C:\Program Files (x86)\MyProgram
Path3: C:\Program Files (x86)\MyProgram\
Path4: C:\Windows\system32
Path5: C:\Windows\system32
Path6: file:\C:\Program Files (x86)\MyProgram
Path7: C:\Program Files (x86)\MyProgram

Vielleicht ist es für einige von Ihnen hilfreich, dasselbe zu tun, wenn Sie die beste Variable für Ihren Fall suchen.


4
Sehr relevante Antwort. So viele Leute vergessen das "Arbeitsverzeichnis"! = "Programmverzeichnis".
Nyerguds

3

Nach meiner Erfahrung ist der beste Weg eine Kombination aus diesen.

  1. System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase Gibt Ihnen den Ordner bin
  2. Directory.GetCurrentDirectory() Funktioniert gut mit .Net Core, aber nicht mit .Net und gibt Ihnen das Stammverzeichnis des Projekts
  3. System.AppContext.BaseDirectoryund AppDomain.CurrentDomain.BaseDirectory Funktioniert gut in .Net, aber nicht in .Net Core und gibt Ihnen das Stammverzeichnis des Projekts

In einer Klassenbibliothek, die auf.Net und .Net Core abzielen soll, überprüfe ich, welches Framework die Bibliothek hostet, und wähle das eine oder andere aus.


2

Ich habe diesen erfolgreich verwendet

System.IO.Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName)

Es funktioniert sogar innerhalb von Linqpad.


1
Hier fehlt die öffnende Klammer von GetCurrentProcess. Übrigens wird es in meinem .net-Kernprojekt beim Debuggen in Visual Studio als C: \ Programme \ dotnet ausgewertet, da sich dort dotnet.exe befindet
t0b4cc0

1

Wurzelverzeichnis:

DriveInfo cDrive = new DriveInfo(System.Environment.CurrentDirectory);
var driverPath = cDrive.RootDirectory;

1
Dies scheint das aktuelle Arbeitsverzeichnis zu erhalten, obwohl dies manchmal nützlich sein kann, ist es definitiv nicht garantiert, dass es sich um den EXE-Pfad handelt.
Krowe2

0

Wenn Sie wissen, dass Sie das Stammverzeichnis erhalten:

string rootPath = Path.GetPathRoot(Application.StartupPath)

0

dieser System.IO.Path.GetDirectory(Application.ExecutablePath)änderte sich zuSystem.IO.Path.GetDirectoryName(Application.ExecutablePath)

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.