Frage Wie kann ich den Pfad der Anwendung in einer .NET-Konsolenanwendung abrufen?


Wie finde ich den Pfad der Anwendung in einer Konsolenanwendung?

Im Windows Forms, Ich kann nutzen Application.StartupPath Um den aktuellen Pfad zu finden, scheint dieser jedoch in einer Konsolenanwendung nicht verfügbar zu sein.


809
2018-05-07 23:05


Ursprung


Antworten:


System.Reflection.Assembly.GetExecutingAssembly().Location1

Kombiniere das mit System.IO.Path.GetDirectoryName wenn alles was du willst ist das Verzeichnis.

1Laut Mr.Mindors Kommentar:
System.Reflection.Assembly.GetExecutingAssembly().Location gibt an, wo sich die ausführende Assembly gerade befindet, wo sich die Assembly befindet oder nicht, wenn sie nicht ausgeführt wird. Im Fall von Schattenkopier-Assemblys erhalten Sie einen Pfad in einem temporären Verzeichnis. System.Reflection.Assembly.GetExecutingAssembly().CodeBase wird den "permanenten" Weg der Versammlung zurückgeben.


1035
2018-05-07 23:09



Sie können den folgenden Code verwenden, um das aktuelle Anwendungsverzeichnis abzurufen.

AppDomain.CurrentDomain.BaseDirectory

361
2018-05-08 19:03



Sie haben zwei Möglichkeiten, das Verzeichnis der Anwendung zu finden, das Sie je nach Ihrem Verwendungszweck auswählen.

// to get the location the assembly is executing from
//(not necessarily where the it normally resides on disk)
// in the case of the using shadow copies, for instance in NUnit tests, 
// this will be in a temp directory.
string path = System.Reflection.Assembly.GetExecutingAssembly().Location;

//To get the location the assembly normally resides on disk or the install directory
string path = System.Reflection.Assembly.GetExecutingAssembly().CodeBase;

//once you have the path you get the directory with:
var directory = System.IO.Path.GetDirectoryName(path);

122
2017-10-14 18:27



Wahrscheinlich ein bisschen spät, aber das ist erwähnenswert:

Environment.GetCommandLineArgs()[0];

Oder richtiger, um nur den Verzeichnispfad zu erhalten:

System.IO.Path.GetDirectoryName(Environment.GetCommandLineArgs()[0]);

Bearbeiten:

Nicht wenige haben darauf hingewiesen GetCommandLineArgs Es wird nicht garantiert, dass der Programmname zurückgegeben wird. Sehen Das erste Wort in der Befehlszeile ist der Programmname nur nach Vereinbarung. Der Artikel besagt, dass "Obwohl extrem wenige Windows-Programme diese Eigenart verwenden (ich kenne mich selbst nicht)". So ist es möglich zu "spoofen" GetCommandLineArgs, aber wir reden über eine Konsolenanwendung. Konsolen-Apps sind normalerweise schnell und dreckig. Das passt also zu meiner KISS-Philosophie.


72
2018-05-21 13:27



Für alle, die sich für asp.net Web Apps interessieren. Hier sind meine Ergebnisse von 3 verschiedenen Methoden

protected void Application_Start(object sender, EventArgs e)
{
  string p1 = System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
  string p2 = System.Web.Hosting.HostingEnvironment.ApplicationPhysicalPath;
  string p3 = this.Server.MapPath("");
  Console.WriteLine("p1 = " + p1);
  Console.WriteLine("p2 = " + p2);
  Console.WriteLine("p3 = " + p3);
}

Ergebnis

p1 = C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\root\a897dd66\ec73ff95\assembly\dl3\ff65202d\29daade3_5e84cc01
p2 = C:\inetpub\SBSPortal_staging\
p3 = C:\inetpub\SBSPortal_staging

Die App läuft physikalisch von "C: \ inetpub \ SBSPortal_staging", daher ist die erste Lösung definitiv nicht für Web-Apps geeignet.


38
2017-10-06 19:42



Die Antwort oben war 90% von dem, was ich brauchte, aber gab mir einen Uri anstelle eines normalen Weges zurück.

Wie im MSDN Forenbeitrag erläutert, Wie konvertiert man einen URI-Pfad in einen normalen Dateipfad?Ich habe folgendes benutzt:

// Get normal filepath of this assembly's permanent directory
var path = new Uri(
    System.IO.Path.GetDirectoryName(
        System.Reflection.Assembly.GetExecutingAssembly().CodeBase)
    ).LocalPath;

34
2018-04-13 20:20



Möglicherweise möchten Sie dies tun:

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

26
2018-05-07 23:10



Sie können stattdessen dieses verwenden.

System.Environment.CurrentDirectory

18
2017-11-15 20:06



Für Konsolenanwendungen können Sie Folgendes versuchen:

System.IO.Directory.GetCurrentDirectory();

Ausgabe (auf meinem lokalen Rechner):

c: \ Benutzer \ xxxxxxx \ Dokumente \ Visual Studio 2012 \ Projekte \ ImageHandler \ GetDir \ bin \ Debug

Oder du kannst es versuchen (am Ende gibt es einen zusätzlichen Backslash):

AppDomain.CurrentDomain.BaseDirectory

Ausgabe:

c: \ Benutzer \ xxxxxxx \ Dokumente \ Visual Studio 2012 \ Projekte \ ImageHandler \ GetDir \ bin \ Debug \


17
2018-06-18 21:34



Ich habe diesen Code verwendet und die Lösung erhalten.

AppDomain.CurrentDomain.BaseDirectory

12
2018-01-31 08:17