Aktuellen Ordnerpfad abrufen

222

Ich möchte ein Programm erstellen, das Dateien konvertiert. Ich möchte, dass der Benutzer die ausführbare Datei in einem beliebigen Verzeichnis ablegen kann. Wenn Sie dieses Programm ausführen (Doppelklick auf die EXE-Datei), möchte ich, dass das Programm alle Dateien in dem aktuellen Ordner verarbeitet, in dem sich die exe-Datei befindet . Wie kann das Programm den Pfad bestimmen, in dem es gerade ausgeführt wird?

Ich habe es versucht, System.Windows.Forms.Application.StartupPathaber das scheint der falsche Weg zu sein.

Irgendwelche Ideen?

user2214609
quelle

Antworten:

334

Sie sollten esDirectory.GetCurrentDirectory() in Ihrem Fall nicht verwenden , da das aktuelle Verzeichnis vom Ausführungsordner abweichen kann, insbesondere wenn Sie das Programm über eine Verknüpfung ausführen.

Es ist besser Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);für Ihren Zweck zu verwenden. Dies gibt den Pfadnamen zurück, in dem sich die aktuell ausgeführte Assembly befindet.

Während mein vorgeschlagener Ansatz es Ihnen ermöglicht, zwischen der ausführenden Baugruppe, der Eingangsbaugruppe oder einer anderen geladenen Baugruppe zu unterscheiden, wie Soner Gönül in seiner Antwort sagte:

System.IO.Path.GetDirectoryName(Application.ExecutablePath);

kann auch ausreichend sein. Dies wäre gleich

System.IO.Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
Thorsten Dittmar
quelle
10
GetEntryAssembly () und GetExecutingAssembly () weisen einen interessanten Unterschied auf. Weitere Informationen finden Sie unter stackoverflow.com/a/18562036/30289
bhadra
3
Wie gesagt: Dies gibt den Pfadnamen zurück, in dem sich die aktuell ausgeführte Assembly befindet. Der Unterschied zwischen GetEntryAssemblyund GetExecutingAssemblynicht so überraschend ist auch der Funktionsname. Wenn sie dasselbe taten, warum sollte es zwei Funktionen geben? :-)
Thorsten Dittmar
2
+1 Assembly.GetEntryAssembly () half mir beim Ausführen der Anwendung über clickonce
Artiom
9
Dies ist in System.Reflection, so System.Reflection.Assembly.GetExecutingAssembly().Locationist die vollständige - wenn Sie aus dem Sofortfenster testen
The Red Pea
147
System.AppDomain.CurrentDomain.BaseDirectory

Dadurch erhalten Sie ein laufendes Verzeichnis Ihrer Anwendung. Dies funktioniert sogar für Webanwendungen. Danach können Sie Ihre Datei erreichen.

hakan
quelle
9
Dies ist die genaueste Eigenschaft, die für diesen Zweck verwendet werden kann. Das BaseDirectory der CurrentDomain zeigt immer auf den richtigen Speicherort, auch wenn die AppDomain dynamisch erstellt wird, um die Assemblys von einem anderen Speicherort aus zu betrachten.
Dhruvin
Perfekt. Dies funktioniert unabhängig für jede Anwendung, insbesondere bei Verwendung von Streamreader, der je nach Anwendungstyp unterschiedliche absolute Pfade lesen kann.
user3326078
40

Ich habe eine einfache Konsolenanwendung mit dem folgenden Code erstellt:

Console.WriteLine(System.IO.Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location));
Console.WriteLine(System.AppDomain.CurrentDomain.BaseDirectory);
Console.WriteLine(System.Environment.CurrentDirectory);
Console.WriteLine(System.IO.Directory.GetCurrentDirectory());
Console.WriteLine(Environment.CurrentDirectory);

Ich habe die resultierende ausführbare Datei nach kopiert C:\temp2. Ich habe dann eine Verknüpfung zu dieser ausführbaren Datei eingefügt C:\temp3und sie ausgeführt (einmal von der Exe selbst und einmal von der Verknüpfung). Es gab beide Male die folgenden Ausgaben:

C:\temp2
C:\temp2\
C:\temp2
C:\temp2
C:\temp2

Ich bin mir zwar sicher, dass es einen Cockamamie-Grund geben muss, um zu erklären, warum es fünf verschiedene Methoden gibt , die praktisch genau dasselbe tun, aber ich weiß sicherlich nicht, was es ist. Es scheint jedoch, dass Sie unter den meisten Umständen frei wählen können, welche Sie möchten.

UPDATE: Ich habe die Shortcut-Eigenschaften geändert und das Feld "Start In:" in geändert C:\temp3. Dies führte zu folgender Ausgabe:

C:\temp2
C:\temp2\
C:\temp3
C:\temp3
C:\temp3

... was zumindest einige der Unterschiede zwischen den verschiedenen Methoden zeigt.

kmote
quelle
2
Vielen Dank.
Baj9032
Ein wichtiger Hinweis. Das Arbeitsverzeichnis ist nicht immer dasselbe wie das installierte Verzeichnis.
Jordanien
24

Versuche dies:

System.Environment.CurrentDirectory

Hossein Narimani Rad
quelle
1
Environment.CurrentDirectorykann auf verschiedene Arten geändert werden ... (Shotrtcut-Einstellungen usw.)
Yousha Aleayoub
21
string appPath = System.IO.Path.GetDirectoryName(Application.ExecutablePath);

Von Path.GetDirectoryName

Gibt die Verzeichnisinformationen für die angegebene Pfadzeichenfolge zurück.

Von Application.ExecutablePath

Ruft den Pfad für die ausführbare Datei ab, mit der die Anwendung gestartet wurde, einschließlich des Namens der ausführbaren Datei.

Soner Gönül
quelle
19

Benutze das,

var currentDirectory = System.IO.Directory.GetCurrentDirectory(); 

Sie können dies auch verwenden.

var currentDirectory = Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location);
fhnaseer
quelle
9

für .NET CORE verwendenSystem.AppContext.BaseDirectory

(als Ersatz für AppDomain.CurrentDomain.BaseDirectory)

Yonatan
quelle
6

1.

Directory.GetCurrentDirectory();

2.

Thread.GetDomain().BaseDirectory

3.

Environment.CurrentDirectory
Tomtom
quelle
Environment.CurrentDirectorykann auf verschiedene Arten geändert werden ... (Shotrtcut-Einstellungen usw.)
Yousha Aleayoub
0

Wenn Sie den exe-Pfad möchten, können Sie ihn verwenden System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetEntryAssembly().Location);

Howard Rothenburg
quelle
0

Dies funktioniert am besten für mich, insbesondere bei Verwendung von Dotnet Core Single File Publish. Path.GetDirectoryName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName).

Keisha W.
quelle