none
Zugriff auf XML-Dateien RRS feed

  • 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

    Mittwoch, 12. Juni 2013 09:51

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

    Mittwoch, 12. Juni 2013 09:55
    Moderator
  • 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

    Mittwoch, 12. Juni 2013 11:35
  • 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

    Mittwoch, 12. Juni 2013 12:08
    Moderator
  • 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\Local

    Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
    ergibt: C:\Users\ich\AppData\Roaming

    Assembly.GetExecutingAssembly.Location
    ergibt: C:\Users\ich\AppData\Local\assembly\dl3\V10NGM6A.PDW\YOO9R1A5.X72\b116ce1a\9f5c0189_7267ce01\Projekt.DLL

    Assembly.GetExecutingAssembly.CodeBase
    ergibt: file:///C:/Users/ich/Documents/Visual Studio 2010/Projects/Projektmappe/Hauptprojekt/bin/Debug/Projekt.DLL

    Irgendwie passt alles nicht.

    Wie komme ich an den richtigen Pfad?

    Für jetzt beim Debuggen

    und für den Produktivbetrieb

    Gruß

    Jürgen

    Mittwoch, 12. Juni 2013 13:57
  • 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.

    Mittwoch, 12. Juni 2013 14:14
  • Hallo Dennis,

    ich habe gerade alle Vorschläge durchprobiert. Es kommen nur Pfade raus, die ich oben schon genannt habe.

    Gruß

    Jürgen

    Mittwoch, 12. Juni 2013 14:28
  • 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.

    Mittwoch, 12. Juni 2013 14:38
  • 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_7267ce01

    My.Computer.FileSystem.CurrentDirectory
    ergibt: C:Users\ich\Documents\Visual Studio 2010\Projects\Projektmappe\Hauptprojekt\bin\Debug

    System.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_7267ce01

    Gruß

    Jürgen

    Mittwoch, 12. Juni 2013 15:07
  • 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.


    Mittwoch, 19. Juni 2013 10:42