Ich sehe, dass es einige Möglichkeiten gibt, den Pfad des Anwendungsordners zu ermitteln:
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?
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 Stammverzeichnis der Anwendung und nicht der Unterordner bin. Dies ist wahrscheinlich das, was Sie normalerweise möchten. In einer Clientanwendung ist dies das Verzeichnis, in dem sich die Hauptprogrammdatei befindet.
In einer VSTO 2005-Anwendung ist dies das Verzeichnis, das die von VSTO verwalteten Assemblys für Ihre Anwendung enthält, und nicht etwa der Pfad zur ausführbaren Excel-Datei.
Die anderen Benutzer können abhängig von Ihrer Umgebung unterschiedliche Verzeichnisse zurückgeben - 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 Fall wird Location
wahrscheinlich der Assembly-Download-Cache sein. Es kann nicht garantiert werden, dass CodeBase für Assemblys in GAC festgelegt wird.
Application.StartupPath
und 7. System.IO.Path.GetDirectoryName(Application.ExecutablePath)
- Funktioniert nur für Windows Forms-Anwendung
System.IO.Path.GetDirectoryName(
System.Reflection.Assembly.GetExecutingAssembly().Location)
Gibt Ihnen etwas wie: "C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319\\Temporary ASP.NET Files\\legal-services\\e84f415e\\96c98009\\Assembly\\dl3\\42aaba80\\bcf9fd83_4b63d101"
Hier befindet sich die Seite, die Sie ausführen.
AppDomain.CurrentDomain.BaseDirectory
für eine Webanwendung könnte nützlich sein und gibt etwas wie "C:\\hg\\Services\\Services\\Services.Website\\"
zurück, das das Basisverzeichnis ist und sehr nützlich ist.
System.IO.Directory.GetCurrentDirectory()
und 5. Environment.CurrentDirectory
gibt den Ort an, von dem aus der Prozess ausgelöst wurde - also für Webanwendungen, die im Debug-Modus von Visual Studio ausgeführt werden, etwa "C:\\Program Files (x86)\\IIS Express"
System.IO.Path.GetDirectoryName(
System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase)
sie erhalten den Ort, an dem sich .dll
befindet, an dem der Code ausgeführt wird. Für Web-Apps könnte dies "file:\\C:\\hg\\Services\\Services\\Services.Website\\bin"
sein.
Im Falle von beispielsweise Konsolen-App-Punkten 2-6 wird das Verzeichnis sein, in dem sich .exe
-Datei befindet.
Ich hoffe, das erspart Ihnen etwas Zeit.
Beachten Sie, dass nicht alle diese Methoden denselben Wert zurückgeben. In einigen Fällen können sie denselben Wert zurückgeben, aber seien Sie vorsichtig, ihr Zweck ist anders:
Application.StartupPath
gibt den Parameter StartupPath
zurück (kann beim Ausführen der Anwendung festgelegt werden)
System.IO.Directory.GetCurrentDirectory()
gibt das aktuelle Verzeichnis zurück, das der Ordner sein kann, in dem sich die Anwendung befindet. Dasselbe gilt für Environment.CurrentDirectory
. Falls Sie dies in einer DLL -Datei verwenden, wird der Pfad zurückgegeben, an dem der Prozess ausgeführt wird.
Rufen Sie für eine Webanwendung zum Abrufen des aktuellen Stammverzeichnisses der Webanwendung im Allgemeinen die Webseite für die aktuelle eingehende Anforderung auf:
HttpContext.Current.Server.MapPath();
System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;
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 erfahren, welche Variable die beste ist.
Für alle 7 Fälle aus der obigen Frage sind die Ergebnisse die folgenden:
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, die gleichen Dinge zu tun, wenn Sie die beste Variable für Ihren Fall suchen.
Ich habe dieses erfolgreich benutzt
System.IO.Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName)
Es funktioniert sogar in linqpad.
Wurzelverzeichnis:
DriveInfo cDrive = new DriveInfo(System.Environment.CurrentDirectory);
var driverPath = cDrive.RootDirectory;
Wenn Sie wissen, wie Sie das Stammverzeichnis abrufen:
string rootPath = Path.GetPathRoot(Application.StartupPath)
dieses "System.IO.Path.GetDirectory (Application.ExecutablePath)" wurde in .__ geändert. System.IO.Path.GetDirectoryName (Application.ExecutablePath)
Nach meiner Erfahrung ist der beste Weg eine Kombination davon.
System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase
Gibt Ihnen den bin-OrdnerDirectory.GetCurrentDirectory()
Works funktioniert gut mit .Net Core, aber nicht mit .Net und gibt Ihnen das Stammverzeichnis des ProjektsSystem.AppContext.BaseDirectory
und AppDomain.CurrentDomain.BaseDirectory
Werke in .Net aber nicht .Net core und gibt Ihnen das Stammverzeichnis des ProjektsIn einer Klassenbibliothek, die target.Net und .Net Core verwenden soll, überprüfe ich, welches Framework die Bibliothek hostet, und wähle das eine oder das andere aus.