Ich sehe, dass es einige Möglichkeiten gibt, den Pfad des Anwendungsordners abzurufen:
Application.StartupPath
System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().Location)
AppDomain.CurrentDomain.BaseDirectory
System.IO.Directory.GetCurrentDirectory()
Environment.CurrentDirectory
System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)
System.IO.Path.GetDirectory(Application.ExecutablePath)
Was ist je nach Situation der beste Weg?
IHostEnvironment.ContentRootPath
, Zugriff über eine injizierteIHostEnvironment
Abhängigkeit (die andere nützliche Dinge enthält).Antworten:
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.
CodeBase
ist der Ort, an dem eine Datei gefunden wurde, und kann eine URL sein, die mit http: // beginnt. In diesem FallLocation
wird wahrscheinlich der Assembly-Download-Cache sein. Es ist nicht garantiert, dass CodeBase für Assemblys im GAC festgelegt wird .quelle
Path.Combine
stattdessen verwenden. Dies wird den nachfolgenden Backslash für Sie erledigen.Application.StartupPath
und 7.System.IO.Path.GetDirectoryName(Application.ExecutablePath)
- Funktioniert nur für Windows Forms-AnwendungenSystem.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.AppDomain.CurrentDomain.BaseDirectory
fü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.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"
System.IO.Path.GetDirectoryName( System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)
Sie erhalten den Ort, an
.dll
dem 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.
quelle
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:
gibt den
StartupPath
Parameter zurück (kann beim Ausführen der Anwendung festgelegt werden)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).quelle
GetCurrentDirectory()
, aus Liebe, Dinge von verschiedenen Wegen zu laufen! :(Um für eine Webanwendung das aktuelle Stammverzeichnis der Webanwendung abzurufen, rufen Sie im Allgemeinen per Webseite die aktuelle eingehende Anforderung auf:
Oben Codebeschreibung
quelle
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:
Vielleicht ist es für einige von Ihnen hilfreich, dasselbe zu tun, wenn Sie die beste Variable für Ihren Fall suchen.
quelle
Nach meiner Erfahrung ist der beste Weg eine Kombination aus diesen.
System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase
Gibt Ihnen den Ordner binDirectory.GetCurrentDirectory()
Funktioniert gut mit .Net Core, aber nicht mit .Net und gibt Ihnen das Stammverzeichnis des ProjektsSystem.AppContext.BaseDirectory
undAppDomain.CurrentDomain.BaseDirectory
Funktioniert gut in .Net, aber nicht in .Net Core und gibt Ihnen das Stammverzeichnis des ProjektsIn 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.
quelle
Ich habe diesen erfolgreich verwendet
Es funktioniert sogar innerhalb von Linqpad.
quelle
Wurzelverzeichnis:
quelle
Wenn Sie wissen, dass Sie das Stammverzeichnis erhalten:
quelle
dieser
System.IO.Path.GetDirectory(Application.ExecutablePath)
änderte sich zuSystem.IO.Path.GetDirectoryName(Application.ExecutablePath)
quelle