c# dateipfad?

4 Antworten

Du kannst in C# auch relative Pfade verwenden und musst nicht von einem Root Directory ausgehen.

Die Pfade sind immer relativ zum Ausführungsort des Programms zu verstehen.

Wenn ich zB in meinem Programm schreibe

File.Open(argv[0]);

Und das Programm in dem Ordner C:/Test mit dem Argument test.txt ausführe. Dann wird das Programm die Datei C:/Test/test.txt öffnen.

Wenn ich als Argument ../test.txt übergebe wird die Datei:

C:/test.txt geöffnet, weil der realtive Pfad ../ ins Elternverzeichnis geht.

ohwehohach  13.05.2019, 15:09
Die Pfade sind immer relativ zum Ausführungsort des Programms zu verstehen.

Das ist korrekt. Der Ausführungsort ist aber nicht zwangsläufig auch der Ort, wo das Programm liegt.

Lege Dein Programm mal in den Ordner C:\Windows und erzeuge in C:\Windows auch eine Datei test.txt. Dann öffne per CMD die Konsole. Wechsle nicht in C:\Windows, sondern gib jetzt einfach mal als Argument für Dein Programm test.txt an.

Schon geht's nicht, obgleich sowohl Testprogramm als auch test.txt in C:\Windows liegen und das Programm wegen PATH auch gefunden und gestartet wird. Dennoch ist der Ausführungsort des Programms der Ordner, in welchem Du Dich gerade in der Konsole befindest und nicht C:\Windows.

Und genau aus dem Grund sollte man niemals davon ausgehen, dass das Programmverzeichnis auch das Ausführungsverzeichnis ist.

0
PeterKremsner  13.05.2019, 16:37
@ohwehohach
Der Ausführungsort ist aber nicht zwangsläufig auch der Ort, wo das Programm liegt.

Habe ich auch nie behauptet.

Ich habe die Frage so interpretiert, dass das File test.txt an irgendeinem Ort liegt und nicht zwingend im Programm Verzeichnis.

Damit ist die Frage des Users einfach nur gleichbedeutend damit, ob denn C# relative Pfade als Dateipfad unterstützt.

Oder anders gesagt, ich dachte der TR fragt nach wie er es machen kann, dass er ein File im Ausführungsort bzw relativ dazu öffnen kann ohne, dass er den ganzen Pfad angeben muss.

Wenn das File immer mit dem Programm ausgeliefert ist und immer im selben Ordner wie das Programm abgelegt ist dann stimmts natürlich nicht zusammen, dann würde ich dazu raten, das File als Ressource an das Programm zu binden.

0
ohwehohach  13.05.2019, 16:39
@PeterKremsner

Ich habe auch nichts unterstellt. Ich warne nur: Die Annahme, dass eine Datei, welche sich in Programmordner befindet, immer durch Weglassen Pfadangabe gefunden werden kann, ist falsch, da oftmals Ausführungsort != Programmordner.

0
ohwehohach  13.05.2019, 17:01
@PeterKremsner

Weswegen ich ja auch im ersten Satz meines ersten Kommentars schrieb:

Das ist korrekt.
0

a) 6 ways to get the current directory in C#

b) Du kannst die Datei auch als Ressource zu deinem Projekt hinzufügen, sofern sie fester Bestandteil deiner Anwendung werden soll.

Geh dazu in die Projekteigenschaften und erstelle eine neue Ressource (unter Resources). Wenn du hier nun eine Datei hinzufügst, kannst du diese über Resources.YourFileName ansprechen.

Dafür kannst du den relativen Pfad verwenden:

// z.B. C:\Users\RBM\Documents\Visual Studio 2017\Projects\StreamTest\StreamTest\bin\Debug\test.txt
StreamReader sr = new StreamReader("\\test.txt");
Woher ich das weiß:Studium / Ausbildung
ohwehohach  13.05.2019, 14:57

Das funktioniert nur dann, wenn der aktuelle Ordner auch dem Speicherort der Exe-Datei entspricht. Dies ist nicht immer der Fall.

1

Viele Leute werden Dir zu "GetCurrentDirectory" raten. Das ist aber falsch, denn der von dieser Methode gelieferte Ordner kann abweichen vom Ablageort des ausführbaren Programms (z.B. wenn in einer Verknüpfung ein anderer Ort für "Ausführen in" angegeben ist oder Dein Programm per Batch-File aufgerufen wird oder aus sonstwelchen Gründen).

Eine sichere Methode, um den Pfad herauszufinden, in welchem sich die Exe-Datei befindet, ist:

string exePath = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);

Dann kannst Du den absoluten Pfad auf Deine gewünschte Datei zusammensetzen als:

string fileName = Path.Combine(exePath, "<dateiname>");