it-swarm.com.de

Der beste Weg, um den Pfad des Anwendungsordners zu erhalten

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

  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?

416
Leo Vo

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.

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

  2. 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.

  3. 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.

  4. 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"

  1. 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.

57

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.

55
Vimvq1987

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;

Über Codebeschreibung

6
Raj kumar

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.

1
Beetee

Ich habe dieses erfolgreich benutzt

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

Es funktioniert sogar in linqpad.

1
camilohe

Wurzelverzeichnis:

DriveInfo cDrive = new DriveInfo(System.Environment.CurrentDirectory);
var driverPath = cDrive.RootDirectory;
0
Alparslan ŞEN

Wenn Sie wissen, wie Sie das Stammverzeichnis abrufen:

string rootPath = Path.GetPathRoot(Application.StartupPath)
0
Alparslan ŞEN

dieses "System.IO.Path.GetDirectory (Application.ExecutablePath)" wurde in .__ geändert. System.IO.Path.GetDirectoryName (Application.ExecutablePath)

0
nazim hatipoglu

Nach meiner Erfahrung ist der beste Weg eine Kombination davon.

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

In 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.

0
Ahmed Mansour