Fragensteller
Zugriff auf XML-Dateien

Frage
-
Hallo,
aktuell arbeite ich mit VS2010
Die Projektmappe ist vom Typ "Word 2010-Add-In"
Innerhalb der Projektmappe habe ich weitere Projekte vom Typ "Klassenbibliothek"
Zu einer dieser Klassenbibliothen gehören XML-Dateien, auf die ich sowohl lesend als auch schreiben zugreifen möchte. Wie macht man das am besten? Aktuelle habe ich die Dateien als "Eingebettete Ressource" deffiniert und auf "Immer Kopieren" gesetzt. Lesen kann ich sie jetzt mit
XElement.Load(DataAssembly.GetManifestResourceStream(ResourceBezeichnung))
Aber um sie nach dem ändern wieder an gleicher stelle speichern zu können, brauche ich ...?
Über Hilfe würde ich mich freuen
Grüße
Jürgen Z
Alle Antworten
-
Hallo Jürgen,
Du kannst keine Ressourcen zurück in die Assembly schreiben.
Das einzige, was Du machen kannst, ist, die Datei(en) aus den Resourcen ins Dateisystem des jeweiligen Rechners zu speichern und dann dort zu ändern.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
Hallo Stefan,
ok, d.h. ich habe hier scheinbar noch nicht das Prinzip der Resourcen verstenden. Meine Ziele sind:
- während der Entwicklung möchte ich die XML-Dateien im Projektmappen-Exlorer haben um diese mit dem Editor im schnellen zugriff zu haben.
- Neben den Klassenbibliotheken soll es einen Ordner geben, in dem sich die XML-Dateien befinden.
Mein Problem war von Anfang an, wie ermittel ich den Pfad. Dann habe ich gelesen, wenn man die Dateien als Resource einbindet, braucht man keine Pfade sondern greift über Objekte auf die XML-Dateien zu. Dass die dabei in das Assembly hinein kompiliert werden, wusste ich nicht.
Kannst Du mir mal erklären, wie ich die Ziele erreiche?
Grüße
Jürgen
-
Hallo Jürgen,
Du kannst die XML Dateien ja problemlos in einen Ordner im Projekt einbinden und die Dateien selbst in einer Resourcendatei oder als eingebettete Resource einbinden.
Zur Laufzeit musst Du die Resourcen dann aber für die Bearbeitung in einen Ordner kopieren, in dem der Anwender bzw. die Anwendung auch Schreibrechte hat.
Über Environment.SpecialFolder... kannst Du verschiedene Pfade problemlos ermitteln. Je nach Anforderung kommen bspw. ApplicationData, LocalApplicationData oder auch andere Verzeichnis in Frage. Siehe dazu:
http://msdn.microsoft.com/de-de/library/system.environment.specialfolder.aspx
D.h. Du prüftst beim Programmstart, ob die Dateien dort schon existieren, falls nicht, kopierst Du Sie dorthin und kannst dann damit arbeiten.
Gruß, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community -
Hallo Stefan,
das habe ich noch nicht ganz verstanden (es ist mein erstes VS2010 Projekt). Die XML-Dateien habe ich nun in einem Ordner innerhalb des Projektes. Bei den Eigenschaften der Dateien habe ich angegeben:
Buildvorgang: Inhalt
In Ausgabeverzeichnis kopieren: Immer kopieren
richtig?
Nun landen alle XML-Dateien in:
C:\Users\ich\Documents\Visual Studio 2010\Projects\Projektmappe\Projekt\bin\Debug\XMLOrdner
Aber:
Wie komme ich auf diesen Pfad?
Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)
ergibt: C:\Users\ich\AppData\LocalEnvironment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
ergibt: C:\Users\ich\AppData\RoamingAssembly.GetExecutingAssembly.Location
ergibt: C:\Users\ich\AppData\Local\assembly\dl3\V10NGM6A.PDW\YOO9R1A5.X72\b116ce1a\9f5c0189_7267ce01\Projekt.DLLAssembly.GetExecutingAssembly.CodeBase
ergibt: file:///C:/Users/ich/Documents/Visual Studio 2010/Projects/Projektmappe/Hauptprojekt/bin/Debug/Projekt.DLLIrgendwie passt alles nicht.
Wie komme ich an den richtigen Pfad?
Für jetzt beim Debuggen
und für den Produktivbetrieb
Gruß
Jürgen
-
Hi Jürgen.
Hast du schon mal
My.Application.Info.DirectoryPath
oder
My.Computer.FileSystem.CurrentDirectory
oder/p>
System.Windows.Forms.Application.StartupPath
oder
System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location)
probiert? Vielleicht ist ja was für dich dabei ... ;-)
LG, Dennis.
-
Hi Jürgen.
C:\Users\ich\Documents\Visual Studio 2010\Projects\Projektmappe\Projekt\bin\Debug\XMLOrdner
Wenn dies der Ordner ist, in dem die Dateien sind ...
dann tippe ich mal, dass dein Projekt, das du startest, im Moment in
C:\Users\ich\Documents\Visual Studio 2010\Projects\Projektmappe\Projekt
liegt, richtig?.
Wenn du es dort startest, bekommst du für Application.Info..... normalerweise genau diesen Pfad:
C:\Users\ich\Documents\Visual Studio 2010\Projects\Projektmappe\Projekt\bin\Debug\
während des Debuggens. Vorausgesetzt du hast an den Einstellungen nichts rumgefummelt. Den verwende ich ständig in irgendwelchen Projekten, weil ich ständig auf Dateien im Stammverzeichnis der EXE zugreifen muss.
Wenn du allerdings ein neues Projekt startest, ist dies natürlich erstmal nur temporär, und demnach der Pfad irgendwo in den Untiefen der Windows-Temp-Verzeichnisse.
In einem fertigen Projekt, wenn man es compiliert und ausführt, ist das natürlich der Pfad, wo die EXE in dem Moment liegt.
Welche Pfade liefern denn die von mir oben genannten "Versuche"? Kannst du die mal hier posten?
LG, Dennis.
-
Hallo Dennis,
ich habe in meiner Projektmappe mehrere Projekte. Ich starte nicht
C:\Users\ich\Documents\Visual Studio 2010\Projects\Projektmappe\Projekt
sondern
C:\Users\ich\Documents\Visual Studio 2010\Projects\Projektmappe\Hauptprojekt
My.Application.Info.DirectoryPath
ergibt: C:\Users\ich\AppData\Local\assembly\dl3\V10NGM6A.PDW\YOO9R1A5.X72\b116ce1a\9f5c0189_7267ce01My.Computer.FileSystem.CurrentDirectory
ergibt: C:Users\ich\Documents\Visual Studio 2010\Projects\Projektmappe\Hauptprojekt\bin\DebugSystem.Windows.Forms.Application.StartupPath
ergibt den Pfad von Word (ich bau ja ein Word 2010-Add-In)System.IO.Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location)
ergibt: C:\Users\ich\AppData\Local\assembly\dl3\V10NGM6A.PDW\YOO9R1A5.X72\b116ce1a\9f5c0189_7267ce01Gruß
Jürgen
-
Hallo Jürgen.
Irgendwie ließ mir die Pfadsuche keine Ruhe und da habe ich dies noch aufgestöbert. Vielleicht hilft es dir weiter:
http://dotnet-snippets.de/snippet/getprojectpath/1010
Das bezieht sich offenbar explizit auf Projekte in Projektmappen mit mehreren Projekten. Getestet habe ich es aber selbst noch nicht.
LG, Dennis.
EDI Consultant/Developer
Ich nutze meistens VB6 und VS2005 bis VS2012
Bitte die Antworten sowie weitere hilfreiche Beiträge von Mitgliedern markieren. Vielen Dank.
- Bearbeitet Tom Lambert (Koopakiller)Moderator Mittwoch, 19. Juni 2013 11:20 Link als Link formatiert