2009-09-09 6 views
6

Ich denke, dass diese Frage für die meisten von Ihnen trivial sein kann, aber irgendwie kann ich die Antwort nicht finden ... also habe ich eine Visual Studio 2008 Lösung foo und eine Projektleiste in dieser Lösung. In meiner Bar-Projekt, das ich ein Verzeichnis namens baz haben, sieht es wie folgt aus:C# öffnende Datei in einer Lösung

foo dir 
| 
+-> bar dir 
     | 
     +-> baz dir 
      | 
      +-> asd file 

jetzt will ich meine „asd-Datei“ in bar-Projekt öffnen, müssen aber den genauen Pfad zu „asd-Datei“ Wie kann ich es finden? Ich habe einfach "baz \ asd" versucht, aber es funktioniert nicht.

Danke!

J

Antwort

2

Wenn Sie zur Laufzeit bedeuten offen, das Programm läuft tatsächlich in bar \ bin \ debug (oder bar \ bin \ release), so dass Sie für das berücksichtigen müssen.

Normalerweise werde ich so etwas wie:

#if DEBUG 
filename = @"..\..\baz\asd"; 
#else 
filename = @"baz\asd"; 
#endif 
+0

Dies funktioniert nicht außerhalb von Visual Studio, wenn die Datei nicht in das Ausgabeverzeichnis kopiert wird. – user7116

+0

Im Veröffentlichungsmodus kopiert mein Installationsprogramm alle Dateien, die das Programm benötigt. Ich benutze nicht das eingebaute Installationsprogramm (ich benutze NSIS). Muß man dazu die Datei als Inhalt markieren, damit sie abgeholt werden kann? –

+0

Ja, das Installationsprogramm benötigt sie als Inhalt und kopiert werden. – user7116

9

Sie möchten die Datei öffnen, in bar -project zur Laufzeit in einer C# -Anwendung? Es gibt ein paar Möglichkeiten, dies zu erreichen, und ich gebe dir das Einfachste.

  1. Gehen Sie zur Eigenschaften für asd in Lösung Explorer
  2. Set Build Action zu Content
  3. kopieren Ausgabeverzeichnis einstellen als Copy always (oder Copy if newer)

Sie können nicht Henne verweist auf die Datei wie in Ihrem C# folgt (vorausgesetzt, Ihr Programm nicht das aktuelle Arbeitsverzeichnis aus dem Executable Verzeichnis weg ändert):

using (StreamReader reader = new StreamReader(@"baz\asd")) 
{ 
    // ... 
} 

Die anderen Möglichkeiten beinhalten using embedded resources, was nicht der prägnanteste von Lösungen .

+0

Wenn Sie diesen Dateityp in das Ausgabeverzeichnis kopieren, bleiben zwei Kopien auf der Festplatte. Dies ist in Ordnung, wenn die Dateien klein und wenig sind. –

+1

Ich stimme zu, aber es ist am einfachsten. Unabhängig davon benötigt die Einbettung der Ressource, anstatt sie auf der Festplatte zu belassen, immer noch Platz. – user7116

+1

Ich nicht kopieren oder beim Debuggen einbetten, lassen Sie die Dateien einfach dort, wo sie sind. Für Release-Builds ist mein Installationsprogramm (ich verwende NSIS) für die Installation der erforderlichen Dateien auf dem Zielcomputer zuständig. –

2

Der relative Speicherort der Datei entspricht dem Lösungsverzeichnis. Also, um es zu öffnen in den VS-IDE, können Sie das Befehlsfenster oder das Suchtextfeld auf der Standard-Symbolleiste (Ctrl-D) eintippen:

>open bar\baz\asd 

Wenn Sie es zur Laufzeit tun mögen, müssen Sie Verteilen Sie die Quelldateien mit Ihrer Anwendung, da nichts garantiert, dass sie in der Nähe des Lösungsbaums ausgeführt wird.

Wenn Sie es von einem VS-Add-In tun wollen, bin ich sicher, dass es eine Klasse gibt, die die Lösung darstellt, mit der Sie die darin enthaltenen Projekte aufzählen und dann die Dateieinträge im Bar-Projekt aufzählen können.

0

Es könnte besser sein, ein einfaches Target in die Build-Datei einzufügen (Projektdatei - csproj für C#).Öffnen csproj Datei im Textmodus und fügen:


< Target Name = "Afterbuild" > < Kopieren Quelldateien = "<SourceFileLocationRelativeToPrjFile> \ <Sourcefile> "DestinationFiles =" <Sourcefile>" />
</Ziel >
MS Build wird sich darum kümmern, Ihre Datei an den richtigen Ort zu kopieren - das ist der richtige Ordner, egal, was Ihre Konfiguration (Debug/Release) ist.

Wenn Sie auch an Publishing interessiert sind, müssen Sie noch eine extra Meile gehen, aber ich denke, Sie fragen nicht jetzt - so, wird es einfach halten.

Verwandte Themen