Frage

Ich arbeite in Visual Studio 2005 und habe eine Textdatei hinzugefügt, die durch einen Rechtsklick auf das Projekt in der Lösung Explorer analysiert werden muss, und fügen Sie -> neues Element. Dies stellt die TXT-Datei in den Projektordner. Die Debug-EXE-Datei ist in der / bin / Debug-Ordner.

Wie kann ich darauf richtig an die txt-Datei von Code relative Pfade verwenden, die ordnungsgemäß zurück sind zwei Ordner lösen werden, aber auch im gleichen Ordner zu lösen, nachdem die Lösung veröffentlicht wird?

War es hilfreich?

Lösung

Schauen Sie sich die Anwendungsklasse . Es hat mehrere Mitglieder, die Dateien finden verwendet werden können, usw. in Bezug auf die Anwendung, sobald es installiert ist.

Zum Beispiel Application.ExecutablePath sagt Ihnen, wo der Lauf EXE-Datei befindet; Sie könnten dann einen relativen Pfad verwenden, um die Datei zum Beispiel zu finden .. \ .. \ FileToBeParsed.txt. Dies setzt allerdings voraus, dass die Dateien in der gleichen Ordnerstruktur wie die Projektordnerstruktur eingesetzt werden, die nicht in der Regel der Fall ist.

Betrachten Eigenschaften wie CommonAppDataPath und LocalUserAppDataPath anwendungsbezogenen Dateien zu suchen, sobald ein Projekt bereitgestellt wurde.

Andere Tipps

Wenn ich Ihre Frage richtig verstanden: Wählen Sie die Datei im „Solution Explorer“. Unter Eigenschaften -> zum Ausgabeverzeichnis kopieren, wählen Sie „Immer kopieren“ oder „wenn Neuere Kopieren“. Für Build-Aktion, wählen Sie „Inhalt“. Dadurch wird die Datei in das Verzeichnis / bin / Debug-Ordner auf Build kopieren. Sie sollten von da an aus dem Projektstamm verweisen können.

Eine Alternative, die Datei auf der Festplatte zu lokalisieren wäre die Datei direkt in der kompilierten Assembly als eingebettete Ressource enthält. Um dies zu tun, der rechten Maustaste auf die Datei und wählen Sie „Eingebettete Ressource“, wie die Build-Aktion. Anschließend können Sie die Datei als Byte-Stream abrufen:

Assembly thisAssembly = Assembly.GetExecutingAssembly();
Stream stream = thisAssembly.GetManifestResourceStream("Namespace.Folder.Filename.Ext");
byte[] data = new byte[stream.Length];
stream.Read(data, 0, (int)stream.Length);

Weitere Informationen über eingebettete Ressourcen können hier und hier .

Wenn Sie bauen eine Anwendung für den eigenen Gebrauch, David Krep Vorschlag ist am besten: einfach die Datei in das Ausgabeverzeichnis kopiert werden. Wenn Sie ein Assembly Gebäude sind, die wiederverwendet oder verteilt werden erhalten, dann ist die eingebettete Ressource Option ist vorzuziehen, da es alles in einem einzigen DLL-Paket wird.

würde ich einen Beitrag Build-Schritt, die kopiert die txt-Datei in die aktiven Konfiguration des Ausgabeordner hinzufügen:

xcopy "$(ProjectDir)*.txt" "$(OutDir)"

Es gibt ein paar Makros definiert wie „$(ConfigurationName)", $(ProjectDir)

Gehen Sie

Projekteigenschaften -> Konfigurationseigenschaften -> Debuggen

Stellen Sie "Working Directory" auf $ (TargetDir)

Dann können Sie richtig Ihre Datei verweisen mit einem relativen Pfad in Ihrem Code (beispielsweise ".... \ foo.xml")

Die Application.ExecutablePath Lösung arbeitet nicht für Unittests. Der Weg der vstesthost.exe wird zurückgegeben

System.Reflection.Assembly.GetExecutingAssembly (). Ort arbeiten, sondern gibt den Pfad mit der assembly enthalten.

So funktioniert das:
System.Reflection.Assembly.GetExecutingAssembly().Location + "\..\" + "fileToRead.txt"

Aber:

fileToRead.txt

Funktioniert auch. Seems Arbeitsverzeichnis ist das ausführende Assembly Verzeichnis standardmäßig.

Sie können ein Postbuildereignis fügen Sie die .txt-Datei in den Buildausgabeordner zu kopieren. Dann können Sie den Code annehmen, dass die Datei im selben Ordner wie die ausführbare Datei ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top