it-swarm.com.de

So erhalten Sie Dateien in einem relativen Pfad in C #

Wenn ich eine ausführbare Datei namens app.exe habe, die ich in C # codiere, wie bekomme ich dann Dateien aus einem Ordner, der in demselben Verzeichnis wie app.exe geladen ist und relative Pfade verwendet?

Dies wirft in Pfadausnahme eine unzulässige Zeichenfolge:

string [ ] files = Directory.GetFiles ( "\\Archive\\*.Zip" );

Wie würde man das in C # machen?

27
Joan Venge

Um sicherzustellen, dass Sie den Pfad der Anwendung haben (und nicht nur das aktuelle Verzeichnis), verwenden Sie Folgendes:

http://msdn.Microsoft.com/de-de/library/system.diagnostics.process.getcurrentprocess.aspx

Jetzt haben Sie ein Process-Objekt, das den laufenden Prozess darstellt.

Dann benutze Process.MainModule.FileName:

http://msdn.Microsoft.com/de-de/library/system.diagnostics.processmodule.filename.aspx

Verwenden Sie schließlich Path.GetDirectoryName, um den Ordner mit der EXE-Datei abzurufen:

http://msdn.Microsoft.com/de-de/library/system.io.path.getdirectoryname.aspx

Also das ist was du willst:

string folder = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName) + @"\Archive\";
string filter = "*.Zip";
string[] files = Directory.GetFiles(folder, filter);

(Beachten Sie, dass "\Archive\" aus Ihrer Frage jetzt @"\Archive\" ist: Sie benötigen das @, damit die \-Backslashes nicht als Beginn einer Escape-Sequenz interpretiert werden.

Hoffentlich hilft das!

37
string currentDirectory = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
string archiveFolder = Path.Combine(currentDirectory, "archive");
string[] files = Directory.GetFiles(archiveFolder, "*.Zip");

Der erste Parameter ist der Pfad. Das zweite ist das Suchmuster, das Sie verwenden möchten.

29
Adam Lear

Schreibe es so:

string[] files = Directory.GetFiles(@".\Archive", "*.Zip");

. steht für relativ zu dem Ordner, in dem Sie Ihr Exe gestartet haben, und @, um\im Namen zuzulassen.

Bei der Verwendung von Filtern übergeben Sie es als zweiten Parameter. Sie können auch einen dritten Parameter hinzufügen, um anzugeben, ob Sie rekursiv nach dem Muster suchen möchten.

Um den Ordner zu erhalten, in dem sich Ihre .exe tatsächlich befindet, verwenden Sie:

var executingPath = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
15
Mikael Svenson

Wie andere schon gesagt haben, kann/sollte man die Zeichenkette mit @ voranstellen (obwohl man auch einfach den Backslashes entkommen könnte), aber was sie beschönigten (das heißt, sie wurde nicht erwähnt, obwohl sie eine Änderung vorgenommen hat), war die Tatsache ist, dass, wie ich kürzlich festgestellt habe, die Verwendung von \ am Anfang eines Pfadnamens ohne . zur Darstellung des aktuellen Verzeichnisses auf den Stamm des aktuellen Verzeichnisbaums verweist.

C:\foo\bar>cd \
C:\>

versus

C:\foo\bar>cd .\
C:\foo\bar>

(Die Verwendung von . an sich hat aus meiner Erfahrung die gleiche Wirkung wie die Verwendung von .\ an sich. Ich weiß nicht, ob es bestimmte Fälle gibt, in denen sie irgendwie nicht dasselbe bedeuten.)

Sie können auch einfach den führenden .\ weglassen, wenn Sie möchten.

C:\foo>cd bar
C:\foo\bar>

Wenn Sie wirklich wollten, müssen Sie nicht einmal Backslashes verwenden. Forwardslashes funktionieren einwandfrei! (Obwohl ein einzelner / keinen Alias ​​auf das aktuelle Laufwerksstammverzeichnis gibt wie \.)

C:\>cd foo/bar
C:\foo\bar>

Sie könnten sie sogar abwechseln.

C:\>cd foo/bar\baz
C:\foo\bar\baz>

... Ich habe mich hier wirklich vom Thema entfernt, also ignorieren Sie das alles, wenn Sie nicht interessiert sind.

2
JAB

Ziemlich einfach, verwende den relativen Pfad

string[] offerFiles = Directory.GetFiles(Server.MapPath("~/offers"), "*.csv");
0
Alejandro R