2012-06-12 6 views
41

Ich habe versucht, das Verzeichnis der Konsolenanwendung zu erhalten den Code unten verwenden,Wie Ausführungsverzeichnis der Konsolenanwendung bekommen

Assembly.GetExecutingAssembly().Location 

aber dieses gibt mir, wo der wohnt montieren. Dies kann anders sein als bei der Ausführung der Anwendung.

Meine Konsolenanwendung analysiert Protokolle ohne Parameter. Es muss in den Ordner logs/ innerhalb des Ordners der ausführbaren Datei gehen oder wenn ich ihm einen Pfad zu logs/ gebe es analysiert.

+0

Haben Sie einen Blick auf diese Frage: http://stackoverflow.com/questions/ 674857/sollte-ich-verwende-appdomain-currentdomain-basedirectory-or-system-environment-current – Karsten

Antwort

69

Verwenden Sie Environment.CurrentDirectory.

Ruft den vollständig qualifizierten Pfad des aktuellen Arbeitsverzeichnisses ab oder legt diesen fest.
(MSDN Environment.CurrentDirectory Property)

string logsDirectory = Path.Combine(Environment.CurrentDirectory, "logs"); 

Wenn Ihre Anwendung läuft in c: \ Foo \ BarlogsDirectory-c Punkt: \ Foo \ Bar \ logs.

+15

Das aktuelle Verzeichnis unterscheidet sich von der direc tory, die die aktuelle ausführbare Datei enthält. – KFL

+0

Environment.CurrentDirectory ist ein Wert, der sich während der Ausführung der Anwendung ändern kann und wird. Wenn Sie beispielsweise Standardparameter verwenden, ändert der OpenFileDialog in WinForms diesen Wert in das Verzeichnis, in dem die Datei ausgewählt wurde. –

6

Sicherste Weg:

string temp = Path.GetDirectoryName(Assembly.GetExecutingAssembly().CodeBase); 
+3

Die CodeBase ist eine URL zu dem Ort, an dem die Datei gefunden wurde, während der Speicherort der Pfad ist geladen. Wenn die Assembly beispielsweise aus dem Internet heruntergeladen wurde, beginnt ihre CodeBase möglicherweise mit "http: //", ihr Speicherort beginnt jedoch mit "C: \". Wenn die Datei im Schatten kopiert wurde, wäre der Speicherort der Pfad zur Kopie der Datei im Shadow-Copy-Verzeichnis. Es ist auch gut zu wissen, dass die CodeBase nicht garantiert für Assemblys in der GAC festgelegt ist. Der Speicherort wird jedoch immer für Assemblys festgelegt, die von der Festplatte geladen werden. –

+0

Da ich sicher bin, dass sich die Datei auf der Festplatte befindet, verwende ich diese Version, um einen "normalen" Pfad anstelle eines 'file: //' Pfads zu erhalten: 'Path.GetDirectoryName (new Uri (this.GetType(). Assembly.GetName() .CodeBase) .LocalPath) ' – Timo

16

verwenden:

System.Reflection.Assembly.GetExecutingAssembly().Location 

Kombinieren Sie das mit

System.IO.Path.GetDirectoryName if all you want is the directory. 
+2

[Quelle] (http://Stackoverflow.com/a/837501/397322) – William

+0

Wenn ich Environment.CurrentDirectory verwende, das unter Geplante Aufgabe ausgeführt wird, wird es zu C: \ Windows \ system32 \ gehen Protokoll, das nicht der Ausführungspfad ist. Dann benutze ich diese System.Reflection.Assembly.GetExecutingAssembly(). Location, es zeigt auf meine korrekte exe Ausführungspfad. Vielen Dank! – LifeiSHot

+0

Dies funktioniert möglicherweise nicht so wie Sie es in Komponententests oder Webprojekten mit lokalem IIS hoffen. Die 'CodeBase'-Antwort tut dies. – Timo

Verwandte Themen