Autor Beitrag
WBergmann
Hält's aus hier
Beiträge: 6

Win 8.1, Android
C# (VS 2013), Java (Android Studio 2.1.3)
BeitragVerfasst: Sa 20.08.16 17:22 
Mahlzeit ;)

ich suche seit Tagen im Internet und stellte meine Frage auch schon in einem anderen Forum. Leider ist das andere Forum nicht sehr aktiv.

Mein Problem ist das ich Daten in einer XML-Datei ändern und speichern will. Soweit klappt alles, die Daten werden ausgelesen und wenn ich diese geändert habe, werden die Daten im Zwischenspeicher auch geändert. Das sehe ich wenn ich mir die Datei im Log ausgebe.

Aber wenn ich nun die Save()-Methode aufrufen will, damit die Daten eben auch im Dokument gespeichert werden, gibt Visual Studio mir immer 2 Fehlermeldungen.

Fehler1 Die beste Übereinstimmung für die überladene 'System.Xml.Linq.XElement.Save(System.IO.Stream)'-Methode hat einige ungültige Argumente."

"Fehler2 Argument '1': Konvertierung von 'string' in 'System.IO.Stream' nicht möglich."

Ich habe mich an Folgenden Anleitungen gehalten:

dotnet-forum.de/Know...einer-xml-datei.aspx
dotnet-forum.de/Know...einer-xml-datei.aspx
dotnet-forum.de/Know...einer-xml-datei.aspx


Mein fragliches Programm sieht so aus:

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
private void EinstellungenSpeichern()
        {
            /**
             * pfad gibt an wo das XML-Dokument liegt
             * var ButtonEinstellungen besagt welches Element geladen werden sollen
             * */

            String pfad = "ButtonEinstellungen.xml";
            Einstellungen = XDocument.Load(pfad);
            ButtonEinstellungen = XElement.Load(pfad);

            var artikelname = (from p in ButtonEinstellungen.Elements()
                               where p.Element("ButtonName").Value == tbo_ButtonName.Text
                             select p).First();

            artikelname.SetElementValue("ArtikelName", tb_Artikelname_eing.Text);

            var artikelmenge = (from q in ButtonEinstellungen.Elements()
                               where q.Element("ButtonName").Value == tbo_ButtonName.Text
                               select q).First();

            artikelmenge.SetElementValue("ArtikelMenge", tb_Artikelmenge_eing.Text);

            var artikelekp = (from r in ButtonEinstellungen.Elements()
                                where r.Element("ButtonName").Value == tbo_ButtonName.Text
                                select r).First();

            artikelekp.SetElementValue("EKP", tb_EKP_eing.Text);

            XElement artikelvkp = (from s in ButtonEinstellungen.Elements()
                              where s.Element("ButtonName").Value == tbo_ButtonName.Text
                              select s).First();

            artikelvkp.SetElementValue("VKP", tb_VKP_eing.Text);

            var artikelfarbe = (from t in ButtonEinstellungen.Elements()
                              where t.Element("ButtonName").Value == tbo_ButtonName.Text
                              select t).First();

            artikelfarbe.SetElementValue("Buttonfarbe", tb_Artikelfarbe_eing.Text);

            /**
             * Folgende Aufrufe erzeugen die Fehlermeldung:
             * "Fehler1     Die beste Übereinstimmung für die überladene 'System.Xml.Linq.XElement.Save(System.IO.Stream)'-Methode hat einige ungültige Argumente."
             * "Fehler2      Argument '1': Konvertierung von 'string' in 'System.IO.Stream' nicht möglich."             * 
             * **/


            //ButtonEinstellungen.Save("C:\Users\...\ButtonEinstellungen.xml");
            //XElement.Save("C:\Users\...\ButtonEinstellungen.xml");
            //ButtonEinstellungen.Save("ButtonEinstellungen.xml");
            //XElement.Save("ButtonEinstellungen.xml");

            this.Frame.Navigate(typeof(MainPage));
        }


Ich hoffe hier kann mir Jemand weiterhelfen

Moderiert von user profile iconChristian S.: Tags zu C#-Tags ersetzt
Moderiert von user profile iconTh69: Titel geändert (war "Wo ist mein Fehler, da die Save-Methode bei mir nicht funkti(oniert?)")
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20448
Erhaltene Danke: 2262

Win 10
C# (VS 2019)
BeitragVerfasst: Sa 20.08.16 18:41 
Hallo und :welcome:,

ich habe jetzt mal folgende, "kondensierte" Variante ausprobiert, weil der restliche Quelltext IMHO nicht relevant fürs Speichern ist:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
        private void EinstellungenSpeichern()
        {
            /**
             * pfad gibt an wo das XML-Dokument liegt
             * var ButtonEinstellungen besagt welches Element geladen werden sollen
             * */

            String pfad = @"d:\profile.xml";
            var ButtonEinstellungen = XElement.Load(pfad);
            ButtonEinstellungen.Save(@"d:\foo.xml");
        }


Ich lese eine XML-Datei ein und schreibe sie unter anderem Namen wieder. Das funktioniert bei mir wunderbar. Laut Doku hat die Save-Methode auch eine Überladung, die einen String akzeptiert. Funktioniert meine reduzierte Version bei Dir?

Ein paar Hinweise noch:
- Du solltest immer absolute Pfade verwenden und nicht nur lose Dateinamen. Da weiß man nie so geanu, wo er die Datei dann eigentlich sucht.
- Wenn Du Pfade in C#-String schreibst, solltest ein "@" vor den String schreiben, damit der Backslash ("\") nicht als Escape-Zeichen interpretiert wird.

Grüße
Christian


//edit: Ich sehe gerade das "this.Frame.Navigate". Erstellst Du eventuell eine UWP-App? Da bin ich gerade nicht sicher, ob die Methode einen String als Parameter akzeptiert.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4156
Erhaltene Danke: 865

Win10
C#, C++ (VS 2015/17)
BeitragVerfasst: Sa 20.08.16 18:56 
Hallo,

mittels der FileStream-Klasse (diese erbt von System.IO.Stream) kannst du eine Datei lesen und schreiben:
ausblenden C#-Quelltext
1:
2:
using (var fileStream = new FileStream(filename, FileMode.Create))
    ButtonEinstellungen.Save(fileStream);
WBergmann Threadstarter
Hält's aus hier
Beiträge: 6

Win 8.1, Android
C# (VS 2013), Java (Android Studio 2.1.3)
BeitragVerfasst: Sa 20.08.16 23:32 
Danke für die schnellen Antworten.

@Christian S. Ja es ist eine Universal-App für Win8.1, liegt es dann daran das die Methode keinen String annimmt? Das ärgert mich, denn darauf fand ich bisher keinen Hinweis. Naja es ist eben wie es ist. Danke für deine Hinweise bezüglich Pfad. Doch wenn ich ich den Pfad Absolut machen will, was bietet sich denn da an? Schließlich unterscheiden sich die Pfade doch auf jedem Gerät, ab C:\Users.

@Th69 das mit der FileStream-Klasse habe ich ausprobiert. Da wird alles rot ... also Visual Studio sagt mir das FileStream nicht gefunden wurde, obwohl ich den NameSpace System.IO; benutze. System.IO.FileStream; weigert sich mein Visual Studio zu kennen. Oder brauche ich hier einen anderen NameSpace, weil es eine Universal Windows App ist?


P.S.
Ich habe nun Folgendes probiert:

ausblenden C#-Quelltext
1:
2:
3:
4:
using (StreamWriter stream = new StreamWriter("ButtonEinstellungen.xml"))
            {
                stream.Write(ButtonEinstellungen);
            }


Da kam die Fehlermeldung das eine neue Instanz der abstrakten Klasse nicht machbar sei. Also versuchte ich dann das:

ausblenden C#-Quelltext
1:
2:
3:
4:
using (StreamWriter stream = new StreamWriter("ButtonEinstellungen.xml"))
            {
                stream.Write(ButtonEinstellungen);
            }


Nun weigert sich der StreamWriter einen pfad anzunehmen, obwohl es auch hier in der Doku und dem Beispiel von Microsoft genau so erklärt wird.

Kennt einer von euch die richtige Dokumentation für das Problem? Denn MSDN gibt mir ständig Dokumentationen die nicht zu der App passen. Wenn ich mich nach Microsoft orientiere gibt es eine Fehlermeldung nach der Anderen, bis ich dann ständig auf den Fehlercod CS0144 stoße. Spätestens da ist ende, weil Microsoft nur sagt wie er entsteht aber nicht wie man ihn abstellt...

Ich habe so langsam nen dicken Hals, da Microsoft ständig halbwahre Problemlösungen anbietet (sofern Problemlösungen überhaupt angeboten werden). Wo liegt der tiefere Sinn für Forms, App, Net, etc. immer andere Methoden und Befehle benutzen zu müssen aber nie eine gezielte Doku bereit zu stellen. Auf meine Fragen diesbezüglich bekomme ich von Microsoft auch keine Antwort....


Neuer Nachtrag:

Nun habe ich irgendeine Lösung im Internet gefunden, die vermutlich sogar funktionieren könnte. Leider verstehe ich es nicht (noch) ganz. Jedoch wird mir nun der Zugriff auf die Datei verweigert, unabhängig ob ich den Pfad relativ oder absolut angebe und unabhängig davon wo auf C: ich die Datei gespeichert habe.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
StorageFolder localFolder = ApplicationData.Current.LocalFolder;
            StorageFile textFile = await localFolder.CreateFileAsync(@"C:\ButtonEinstellungen.xml", CreationCollisionOption.ReplaceExisting);
            using (IRandomAccessStream textStream = await textFile.OpenAsync(FileAccessMode.ReadWrite))
            {
                using (DataWriter textWriter = new DataWriter(textStream))
                {
                    textWriter.WriteString(ButtonEinstellungen.ToString());
                    await textWriter.StoreAsync();
                }
            }


Natürlich habe ich die Methode auf private async void gestellt... und String pfad = habe ich auch jedesmal mit geändert.

======================================================================================

Ich habe nun Folgendes als Pfade versucht:

@"\...\...\ButtonEinstellungen.xml"

@"\ButtonEinstellungen.xm"

@"C:\...\ButtonEinstellungen.xml"

@"C:\Buttoneinstellungen.xml"

Jedesmal sobald es in irgendeiner Art absolut ist, wird mir der Zugriff verweigert, wenn es nicht absolut ist, wird noch immer / wieder nur im Speicher geändert aber nicht in der Datei.

Also nach weiteren Stunden bin ich mit neuen Befehlen / Methoden wieder am Ausgangspunkt angekommen und noch immer nicht schlauer geworden.

======================================================================================

Um Verwirrungen zu vermeiden, meine aktuelle Methode sieht so aus:

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
public async void EinstellungenSpeichern()
        {
            /**
             * pfad gibt an wo das XML-Dokument liegt
             * var ButtonEinstellungen besagt welches Element geladen werden sollen
             * */

            String pfad = "ButtonEinstellungen.xml";
            Einstellungen = XDocument.Load(pfad);
            ButtonEinstellungen = XElement.Load(pfad);

            var artikelname = (from p in ButtonEinstellungen.Elements()
                               where p.Element("ButtonName").Value == tbo_ButtonName.Text
                             select p).First();

            artikelname.SetElementValue("ArtikelName", tb_Artikelname_eing.Text);

            var artikelmenge = (from q in ButtonEinstellungen.Elements()
                               where q.Element("ButtonName").Value == tbo_ButtonName.Text
                               select q).First();

            artikelmenge.SetElementValue("ArtikelMenge", tb_Artikelmenge_eing.Text);

            var artikelekp = (from r in ButtonEinstellungen.Elements()
                                where r.Element("ButtonName").Value == tbo_ButtonName.Text
                                select r).First();

            artikelekp.SetElementValue("EKP", tb_EKP_eing.Text);

            XElement artikelvkp = (from s in ButtonEinstellungen.Elements()
                              where s.Element("ButtonName").Value == tbo_ButtonName.Text
                              select s).First();

            artikelvkp.SetElementValue("VKP", tb_VKP_eing.Text);

            var artikelfarbe = (from t in ButtonEinstellungen.Elements()
                              where t.Element("ButtonName").Value == tbo_ButtonName.Text
                              select t).First();

            artikelfarbe.SetElementValue("Buttonfarbe", tb_Artikelfarbe_eing.Text);

            /**
             * Folgende Aufrufe erzeugen die Fehlermeldung:
             * "Fehler1     Die beste Übereinstimmung für die überladene 'System.Xml.Linq.XElement.Save(System.IO.Stream)'-Methode hat einige ungültige Argumente."
             * "Fehler2      Argument '1': Konvertierung von 'string' in 'System.IO.Stream' nicht möglich."             * 
             * **/


            //ButtonEinstellungen.Save("C:\Users\...\ButtonEinstellungen.xml");
            //XElement.Save("C:\Users\...\ButtonEinstellungen.xml");
            //ButtonEinstellungen.Save("ButtonEinstellungen.xml");
            //XElement.Save("ButtonEinstellungen.xml");

            /*using (StreamWriter stream = (StreamWriter) ("ButtonEinstellungen.xml"))
             * 
             * Hier wird der String "ButtonEinstellungen.xml" bemängelt
             * 
            {
                stream.Write(ButtonEinstellungen);
            }*/


            /*using (IsolatedStorageFileStream filestream = store.OpenFile(DB.Datasource, FileMode.Truncate, FileAccess.Write))
            {
                using (var newXML = new StreamWriter(filestream))
                {
                    xmlDoc.Save(newXML);
                }
             * 
             * Hier kennt Visual Studio IsolatedStorageFileStream nicht, laut Doku gehört es auch zu using System.IO; 
             * 
             }*/


            Debug.WriteLine("Änderungen im XElement= " + ButtonEinstellungen);

            /**
             * 
             * Diese Ausgabe lautet:
             * 
             * Änderungen im XElement = <ButtonEinstellungen>
                <Button>
                <ButtonName>bt_artikel01</ButtonName>
                <ArtikelName>Brot</ArtikelName>
                <ArtikelMenge>6</ArtikelMenge>
                <EKP>0,50</EKP>
                <VKP>1,75</VKP>
                <Buttonfarbe>red</Buttonfarbe>
                </Button>
             * 
             **/


            StorageFolder localFolder = ApplicationData.Current.LocalFolder;
            StorageFile textFile = await localFolder.CreateFileAsync("ButtonEinstellungen.xml", CreationCollisionOption.ReplaceExisting);
            using (IRandomAccessStream textStream = await textFile.OpenAsync(FileAccessMode.ReadWrite))
            {
                using (DataWriter textWriter = new DataWriter(textStream))
                {
                    textWriter.WriteString(ButtonEinstellungen.ToString());
                    await textWriter.StoreAsync();
                }
            }

            Debug.WriteLine("Änderungen im XDocument = " + Einstellungen);

            /*StorageFolder localFolder = ApplicationData.Current.LocalFolder;
            StorageFile textFile = await localFolder.CreateFileAsync("Einstellungen.xml", CreationCollisionOption.ReplaceExisting);
            using (IRandomAccessStream textStream = await textFile.OpenAsync(FileAccessMode.ReadWrite))
            {
                using (DataWriter textWriter = new DataWriter(textStream))
                {
                    textWriter.WriteString(ButtonEinstellungen.ToString());
                    await textWriter.StoreAsync();
                }
            }

            Debug.WriteLine("Änderungen im XDocument = " + Einstellungen);*/

            /**
             * 
             * Die Ausgabe lautet:
             * 
             * Änderungen im XDocument = <ButtonEinstellungen>
                <Button>
                <ButtonName>bt_artikel01</ButtonName>
                <ArtikelName>Fisch</ArtikelName>
                <ArtikelMenge>5</ArtikelMenge>
                <EKP>5</EKP>
                <VKP>15</VKP>
                <Buttonfarbe>green</Buttonfarbe>
                </Button>
             * 
             **/


            this.Frame.Navigate(typeof(MainPage));
        }


Also ob
StorageFile textFile = await localFolder.CreateFileAsync("Einstellungen.xml", CreationCollisionOption.ReplaceExisting); oder
StorageFile textFile = await localFolder.CreateFileAsync("ButtonEinstellungen.xml", CreationCollisionOption.ReplaceExisting); verwende, es ändert sich nichts an der Ausgabe. Das Schlimme ist, dass das Programm keine Fehler anzeigt aber eben auch nichts speichert. Genauso wie zu Beginn.

Jedes verflixte Beispiel / Tutorial verweist auf Save(String), also da verstehe ich nicht weshalb es keine anderen Beispiele gibt. Kann ja nicht sein das ich der Erste Mensch auf der Welt bin der in einer UniversalApp ein XML-Dokument beschreiben will...

Ich habe jetzt erstmal wieder nen dicken Hals...

Moderiert von user profile iconTh69: C#-Tags hinzugefügt
Moderiert von user profile iconTh69: Code- durch C#-Tags ersetzt


Zuletzt bearbeitet von WBergmann am So 21.08.16 02:45, insgesamt 1-mal bearbeitet
Palladin007
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1206
Erhaltene Danke: 159

Windows 10 x64 Home Premium
C# (VS 2015 Enterprise)
BeitragVerfasst: So 21.08.16 02:30 
Zitat:
Doch wenn ich ich den Pfad Absolut machen will, was bietet sich denn da an? Schließlich unterscheiden sich die Pfade doch auf jedem Gerät, ab C:\Users.

Schau mal in der Environment-Klasse nach, die sollte eine GetFolderPath-Methode haben, über die Du die absoluten Pfade vom Desktop, Downloads, AppData, etc. abrufen kannst.
Ich weiß aber nicht, wie das unter UWP abläuft, das sieht aber vielversprechend aus: KnownFolders Class
Das hab ich gefunden indem ich nach "c# uwp Environment.GetFolderPath" gesucht habe.


Allgemein solltest Du im Hinterkopf haben, dass UWP noch nicht so alt ist und eben kein normales .NET 4.5 als Basis hat.
Daher kannst Du auch nicht die übliche MSDN-Doku verwenden, die Du findest, wenn Du den Klassennamen suchst, denn die ist für .NET 4.5


Zitat:
Wenn ich mich nach Microsoft orientiere gibt es eine Fehlermeldung nach der Anderen, bis ich dann ständig auf den Fehlercod CS0144 stoße. Spätestens da ist ende, weil Microsoft nur sagt wie er entsteht aber nicht wie man ihn abstellt...

Es kann eben keine Instanz einer abstrakten Klasse erstellt werden, da kannst Du auch nichts dran ändern.
Die Lösung: Erstelle eine Instanz einer nicht abstrakten Klasse.
Die StreamWriter-Klasse erbt z.B. von der abstrakten Klasse TextWriter.
Wenn Du irgendwo einen TextWriter brauchst, kannst Du auch nicht einen TextWriter erzeugen, Du brauchst den StreamWriter - oder eine andere Klasse, die von TextWriter erbt.

Zitat:
Ich habe so langsam nen dicken Hals, da Microsoft ständig halbwahre Problemlösungen anbietet (sofern Problemlösungen überhaupt angeboten werden).

Du musst nach dem richtigen Bereich suchen. Wenn Du nur sowas suchst wie "C# write to file" (oder ähnliches), dann wirst Du eine Lösung für .NET 4.5 (oder älter) finden, weil es einfach viel weiter verbreitet ist. Wenn Du eine Lösung für UWP brauchst, dann such auch danach.

Ich habe mal kurz nach "c# UWP write to file" gesucht und direkt als ersten Treffer das gefunden:
Erstellen, Schreiben und Lesen einer Datei
Das sieht für mich nach exakt dem aus, was Du irgendwo gefunden hast.


Und weil Du sagst, es gibt keine gezielte Doku:
Doch, die gibt es, für beinahe jede einzelne Klasse, Methode, Property, etc. und ist in Form von XML-Dokumentation vorhanden.
Das ist sicher nicht so einfach, wie ein fertiges Beispiel online raus zu pasten, bei sich einzufügen und so lange zu verändern, bis es passt.
Aber so eine Online-Doku schreibt sich eben nicht von selbst, da steckt extrem viel Zeit und Arbeit hinter, Du musst also auf diese XML-Doku zurück greifen oder das, was man online in z.B. Foren findet.

Und da solltest Du noch froh sein. Im schlimmsten Fall hast Du nämlich eine alte chaotische Software, an der Du weiter arbeiten sollst (oder ein Framework, das so aussieht und das Du nutzen sollst) und da hast Du gar keine Dokumentation.
Da kannst Du dich nur auf die Namen verlassen und die wählt Microsoft mMn. in den meisten Fällen recht gut.




Also, eine Menge Text, was ich aber eigentlich sagen will:
Reg dich nicht wegen solchem Kleinkram auf.
Was Microsoft uns hier kostenlos und immer mehr open source anbietet, kann von der Qualität ganz weit oben mit spielen.
Es gibt eine sehr umfangreiche Dokumentation seitens Microsoft und wenn etwas neu ist, sind die da auch sehr hinterher, die Doku nachzuziehen.
Daneben gibt es noch die sehr umfangreiche Community, wo sich oft sehr viel Wissen finden lässt.
Ein bisschen Arbeit bleibt am Ende aber immer übrig, die Du selber machen muss, mal mehr, mal weniger und das gehört auch dazu.




PS:
Als kleiner Tipp, weil unter UWP Datei-Operationen scheinbar asynchron ablaufen:
Versuche nicht, das irgendwie so zum Laufen zu bringen, indem die Methode async ist und void zurück gibt.
Das async-Feature lässt den Code in der Methode ab dem ersten await in einem anderen Thread laufen.
Besser wäre, wenn Du die ganzen asynchronen Abläufe nicht nur irgendwie einbaust, sondern vollständig integrierst. Also dass beim Schreiben in die Datei mit Hilfe des async-Features ein Prozess-Balken angezeigt und der Rest der UI drum herum deaktiviert wird.
Oder Du willst sicher, dass es unbeobachtet im Hintergrund weiter läuft, was ich bei Datei-Operationen aber für eine ganz blöde Idee halte.


Zuletzt bearbeitet von Palladin007 am So 21.08.16 13:16, insgesamt 1-mal bearbeitet
WBergmann Threadstarter
Hält's aus hier
Beiträge: 6

Win 8.1, Android
C# (VS 2013), Java (Android Studio 2.1.3)
BeitragVerfasst: So 21.08.16 03:10 
@ Palladin007

Deine Links schaue ich mir gleich an, doch wie überheblich kann ein Mensch sein?

Zitat:
Du musst nach dem richtigen Bereich suchen. Wenn Du nur sowas suchst wie "C# write to file" (oder ähnliches), dann wirst Du eine Lösung für .NET 4.5 (oder älter) finden, weil es einfach viel weiter verbreitet ist. Wenn Du eine Lösung für UWP brauchst, dann such auch danach.


1. war mir bis zum lesen der ersten Antwort nicht bewusst das es Unterschiede gibt.
2. Suche ich seit dem ausschließlich mit den Wörtern "UWP, Universal App Windows, Universal App" und ähnlichem. Dennoch lande ich ständig bei den nichts helfenden Dokumentationen von Microsoft.
3. suche ich seit 2 Tagen nicht mehr so allgemein wie "write to file", da es zuviele GoogleTreffer produziert, die mir gar nicht helfen.
4. Lösche ich ständig meinen Browserverlauf, Cookies und Co, damit ich nicht ständig auf die Selben Treffer komme.

Aber so wie es zu erkennen ist, hilft es auch nicht.

Zitat:
Und weil Du sagst, es gibt keine gezielte Doku:
Doch, die gibt es, für beinahe jede einzelne Klasse, Methode, Property, etc. und ist in Form von XML-Dokumentation vorhanden.
Das ist sicher nicht so einfach, wie ein fertiges Beispiel online raus zu pasten, bei sich einzufügen und so lange zu verändern, bis es passt.
Aber so eine Online-Doku schreibt sich eben nicht von selbst, da steckt extrem viel Zeit und Arbeit hinter, Du musst also auf diese XML-Doku zurück greifen oder das, was man online in z.B. Foren findet.


Ich weiß zwar nicht ob du mir ernsthaft unterstellen willst, dass ich lediglich fertiges Zeug verwende. Doch so wie es aussieht gibt es keine anständige Doku, denn selbst der Objektkatalog im Visual Studio gibt mir z.B die Meldung das Save(String) funktionieren müsste. Dabei weiß Visual Studio als erstes das ich eine App programmiere. Die Dokus von Microsoft helfen mir weder heute bei der App noch haben sie mir bei WPF noch bei Forms geholfen. Wenn du also irgendwo eine Doku kennst die aktuell und vernünftig ist, dann solltest du auch einen Link oder dergleichen benennen. Alles andere ist schließlich nicht ernsthaft hilfreich.


Zitat:
Reg dich nicht wegen solchem Kleinkram auf.


Wenn es für dich ein Kleinkram ist, wo ist dann dein Lösungsvorschlag? Denn nach mehrtägigen Suchen und um Hilfe fragen ist es definitiv kein Kleinkram mehr.

Nachtrag:

Dein 2. Link sieht zwar so ähnlich aus wie das was ich fand, aber ich habe meinen Ansatz von Stackoverflow.com

stackoverflow.com/qu...arp-in-universal-app

Wie du darauf kommst das dein 1. Link viel versprechend aussieht verstehe ich nicht. msdn.microsoft.com/l...1&cs-lang=csharp

Denn das Beispiel was da aufgeführt ist, ist identisch von dem was ich verwendet habe. Und der dortige Link bezüglich zugriffe msdn.microsoft.com/d...indows/apps/hh464936 beinhaltet nicht den Zugriff auf C: lediglich auf externe Speicher. Der andere Link dort verweist auf ein Beispiel bezüglich Datei lesen (code.msdn.microsoft....ess-sample-d723e597/) das hilft mir auch nicht weiter...und der da enthaltene Verweis auf DataWriter-Class (msdn.microsoft.com/l...indows/apps/br208154) zeigt nur auf wie ich Daten im Arbeitsspeicher speicher. Aber an dem Punkt bin ich seit 4 Tagen.

Ich fände gut wenn du mir mitteilen würdest, weshalb das für dich viel versprechend aussieht / aussah.
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4156
Erhaltene Danke: 865

Win10
C#, C++ (VS 2015/17)
BeitragVerfasst: So 21.08.16 09:39 
Hallo,

vielleicht hast du dich doch mit dem UWP-Projekt ein wenig übernommen? Auch wenn es verlockend ist, mal eben eine tolle App zu entwickeln, aber die Grundlagen der besonders asynchronen Programmierung müssen dafür bekannt sein.

Und bezogen auf CreateFileAsync: schau mal in Saving and Loading App Data (Windows Store C# UWP / 8.1)

PS: Ich habe "UWP" zu den Tags diesen Beitrags hinzugefügt.

PPS: Und noch eine Bitte: auch wenn es ein wenig mehr Arbeit ist, editiert bitte eure Beiträge und setzt den entsprechenden Titel (besonders bei den MSDN-URLs ist der Titel daraus nicht ablesbar):
ausblenden Quelltext
1:
[url=https://...]Titel[/url]					
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20448
Erhaltene Danke: 2262

Win 10
C# (VS 2019)
BeitragVerfasst: So 21.08.16 11:10 
Hallo,

ich glaube, hier gibt es noch ein kleines Problem: Du schreibst, dass Du eine UWP für Windows 8.1 schreibst. Das ist keine gute Idee, wirklich nutzbar sind die erst mit Windows 10 geworden. Das kann auch zu ein bisschen Verwirrung in Bezug auf die Doku geführt haben, bei vielen Artikeln steht bei den unterstützen Plattformen nämlich sowas unten drunter:
Zitat:
Universal Windows Platform
Available since 10

Bei Artikeln im Netz muss man dann auch sehr aufmerksam schauen, ob das für Windows 8(.1) oder für Windows 10 ist. Bei vielen Artikeln im MSDN steht zum Beispiel drüber, dass der Artikel für Win10-UWP sei und Win8 im Archiv zu finden sei. Alles, was ich ab jetzt schreibe, ist unter dem Vorbehalt, dass es sich eventuell auf die falsche Version bezieht, testen kann ich nur mit Win10. ;)

Nun noch ein paar Worte zum Dateizugriff in UWP Apps. Du hast mit Deiner App erst einmal keinen Zugriff auf das generelle Dateisystem, sondern nur auf ausgewählte Ordner und Dateien: Berechtigungen für den Dateizugriff. Möchtest Du auf einen Ordner oder eine Datei zugreifen, die außerhalb dieser "grünen Zone" (kein Fachbegriff ;)) liegt, musst Du Dir vom Benutzer über z.B. FileSavePicker oder FileOpenPicker die Berechtigung dafür holen. Man kann sich eine bestimmte Anzahl davon auch wegspeichern, damit man den Benutzer nicht immer wieder fragen muss: Track recently used files and folders

Wenn ich aber nun in einen Ordner schreibe, auf den ich Zugriff habe, den auch von Dir benutzten LocalFolder, dann schreibt er mir mit diesem Code die Datei, die ich haben will:
ausblenden C#-Quelltext
1:
2:
3:
            StorageFolder localFolder = ApplicationData.Current.LocalFolder;
            StorageFile newFile = await localFolder.CreateFileAsync("foo.xml", CreationCollisionOption.ReplaceExisting);
            await FileIO.WriteTextAsync(newFile, "<foo></foo>");


Einem sollte dann nur klar sein, wo man die Datei dann zu suchen hat, denn der LocalFolder für meine Test-App ist z.B.:
ausblenden Quelltext
1:
C:\Users\chris\AppData\Local\Packages\40367d1f-b568-4d2f-8159-e9ccdf4812ea_p2wxv0ry6mv8g\LocalState					

Und da finde ich die Datei dann auch.

Oder die Verwendung eines Streams geht dann z.B. so:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
            StorageFolder localFolder = ApplicationData.Current.LocalFolder;
            StorageFile newFile = await localFolder.CreateFileAsync("foo.xml", CreationCollisionOption.ReplaceExisting);

            var data = Encoding.UTF8.GetBytes("<foo></foo>");

            using (var stream = await newFile.OpenStreamForWriteAsync())
                await stream.WriteAsync(data, 0, data.Length);


Mein Hinweis, immer absolute Pfade zu verwenden, ist bei der Verwendung von StorageFoldern natürlich nicht mehr gültig, denn z.B in diesem Fall enthält localFolder ja bereits die Pfadinformation.

Viele Grüße
Christian

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
WBergmann Threadstarter
Hält's aus hier
Beiträge: 6

Win 8.1, Android
C# (VS 2013), Java (Android Studio 2.1.3)
BeitragVerfasst: So 21.08.16 13:52 
@Th69

Übernommen habe ich mich gewiss nicht, denn wie soll ich dazu lernen, wenn es keine Herausforderungen gibt. Mein Problem ist lediglich, dass es scheinbar kein Tutorial oder ähnliches gibt. Und die Anleitungen die es gibt sind ja offenbar keine Anleitungen für Iniversal Apps. Was mich eigentlich verwundert das es so kompliziert sein soll. In Java für Android ist es auch kein Hexenwerk auf Xml-Dateien zu zugreifen. Schließlich sind die XML-Dateien ja auch dafür gedacht Plattformübergreifend zu funktionieren.

Also kann (will) ich nicht davon ausgehen, dass ausgerechnet Microsoft es verkompliziert.

@Christian S.

Apps für Win 10 kann und will ich nicht programmieren. Denn dazu müsste ich mir neue Hardware zu legen, was ich derzeit nicht kann. Denn ich habe zweimal versucht das Upgrade auf Win10 zu machen und beide Male waren danach meine RAM's kaputt. Danach habe ich mir gesagt das ich so lange bei WIN 8 bleibe wie möglich.

Ich versuche gleich deine Vorschläge umzusetzen. Aber ich glaube ich habe diese Art schon versucht gehabt. Zumindest sehen sie mir sehr vertraut aus.

Nachtrag:

Ich hatte es in einer ähnlichen Art schon versucht gehabt. Aber auch deine Ansätze machen das Gleiche wie alle anderen auch. Sie ändern die Daten im Arbeitsspeicher, schreiben diese jedoch nicht dauerhaft in die Datei. Das ist was ich ich nicht im Kopf bekommen will. Wenn es schon im Arbeitsspeicher vorhanden ist, weshalb soll es dann so kompliziert sein es in die Datei zu schreiben????

Da ich keine Fehlermeldungen bekomme, gehe ich davon aus, dass es schlicht der verkehrte Aufruf ist. Aber ich habe schon aus lauter Verzweiflung fast alles ausprobiert was ich irgendwie und irgendwo gefunden habe. Das meiste habe ich nur auskommentiert, somit sieht meine Methode nun komplett wirr aus:

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
133:
134:
135:
136:
137:
138:
139:
140:
141:
142:
143:
144:
145:
146:
147:
148:
149:
150:
151:
152:
153:
154:
155:
156:
157:
158:
159:
160:
161:
162:
163:
164:
165:
166:
167:
168:
169:
170:
171:
172:
173:
174:
175:
176:
177:
178:
179:
180:
181:
182:
183:
184:
185:
186:
187:
188:
189:
190:
191:
192:
193:
194:
195:
196:
197:
198:
199:
200:
201:
202:
203:
204:
205:
206:
207:
208:
209:
210:
211:
private async void EinstellungenSpeichern()
        {
            /**
             * pfad gibt an wo das XML-Dokument liegt
             * var ButtonEinstellungen besagt welches Element geladen werden sollen
             * */

            String pfad = ("ButtonEinstellungen.xml");
            Einstellungen = XDocument.Load(@"ButtonEinstellungen.xml");
            ButtonEinstellungen = XElement.Load(pfad);

            var artikelname = (from p in ButtonEinstellungen.Elements()
                               where p.Element("ButtonName").Value == tbo_ButtonName.Text
                             select p).First();

            artikelname.SetElementValue("ArtikelName", tb_Artikelname_eing.Text);

            var artikelmenge = (from q in ButtonEinstellungen.Elements()
                               where q.Element("ButtonName").Value == tbo_ButtonName.Text
                               select q).First();

            artikelmenge.SetElementValue("ArtikelMenge", tb_Artikelmenge_eing.Text);

            var artikelekp = (from r in ButtonEinstellungen.Elements()
                                where r.Element("ButtonName").Value == tbo_ButtonName.Text
                                select r).First();

            artikelekp.SetElementValue("EKP", tb_EKP_eing.Text);

            var artikelvkp = (from s in ButtonEinstellungen.Elements()
                              where s.Element("ButtonName").Value == tbo_ButtonName.Text
                              select s).First();

            artikelvkp.SetElementValue("VKP", tb_VKP_eing.Text);

            /*var artikelvkp = from s in ButtonEinstellungen.Descendants("ButtonEinstellungen")
                             where s.Element("ButtonName").Value == tbo_ButtonName.Text
                             select s;
            foreach (XElement item in artikelvkp)
            {
                item.SetElementValue("VKP", tb_VKP_eing.Text);

                // klappt gar nicht
            }/*
           
            var artikelfarbe = (from t in ButtonEinstellungen.Elements()
                              where t.Element("ButtonName").Value == tbo_ButtonName.Text
                              select t).First();

            artikelfarbe.SetElementValue("Buttonfarbe", tb_Artikelfarbe_eing.Text);

            /**
             * Folgende Aufrufe erzeugen die Fehlermeldung:
             * "Fehler1     Die beste Übereinstimmung für die überladene 'System.Xml.Linq.XElement.Save(System.IO.Stream)'-Methode hat einige ungültige Argumente."
             * "Fehler2      Argument '1': Konvertierung von 'string' in 'System.IO.Stream' nicht möglich."             * 
             * **/


            //ButtonEinstellungen.Save("C:\Users\...\ButtonEinstellungen.xml");
            //XElement.Save("C:\Users\...\ButtonEinstellungen.xml");
            //ButtonEinstellungen.Save("ButtonEinstellungen.xml");
            //XElement.Save("ButtonEinstellungen.xml");

            /*using (StreamWriter stream = (StreamWriter) ("ButtonEinstellungen.xml"))
             * 
             * Hier wird der String "ButtonEinstellungen.xml" bemängelt
             * 
            {
                stream.Write(ButtonEinstellungen);
            }*/


            /*using (IsolatedStorageFileStream filestream = store.OpenFile(DB.Datasource, FileMode.Truncate, FileAccess.Write))
            {
                using (var newXML = new StreamWriter(filestream))
                {
                    xmlDoc.Save(newXML);
                }
             * 
             * Hier kennt Visual Studio IsolatedStorageFileStream nicht, laut Doku gehört es auch zu using System.IO; 
             * 
             }*/


            Debug.WriteLine("Änderungen im XElement= " + ButtonEinstellungen);

            /**
             * 
             * Diese Ausgabe lautet:
             * 
             * Änderungen im XElement = <ButtonEinstellungen>
                <Button>
                <ButtonName>bt_artikel01</ButtonName>
                <ArtikelName>Brot</ArtikelName>
                <ArtikelMenge>6</ArtikelMenge>
                <EKP>0,50</EKP>
                <VKP>1,75</VKP>
                <Buttonfarbe>red</Buttonfarbe>
                </Button>
             * 
             **/


            /*StorageFolder localFolder = ApplicationData.Current.LocalFolder;
            StorageFile textFile = await localFolder.CreateFileAsync(@"\ButtonEinstellungen.xml", CreationCollisionOption.ReplaceExisting);
            using (IRandomAccessStream textStream = await textFile.OpenAsync(FileAccessMode.ReadWrite))
            {
                using (DataWriter textWriter = new DataWriter(textStream))
                {
                    textWriter.WriteString(ButtonEinstellungen.ToString());
                    await textWriter.StoreAsync();
                }

                //Speichert wieder nur im Arbeitsspeicher und nicht im Dokument

            }*/


            /*StorageFolder localFolder = ApplicationData.Current.LocalFolder;
            StorageFile textFile = await localFolder.GetFileAsync(@"\ButtonEinstellungen.xml");
            using (IRandomAccessStream textStream = await Windows.Storage.FileIO.WriteTextAsync(textFile, "Swift as a shadow"))
            {
                using (DataWriter textWriter = new DataWriter(textStream))
                {
                    textWriter.WriteString(ButtonEinstellungen.ToString());
                    await textWriter.StoreAsync();
                }

                // Eine implizite Konvertierung von Typ 'void' in 'Windows.Storage.Streams.IRandomAccessStream' ist nicht möglich.
            }*/


            /*StorageFolder localFolder = ApplicationData.Current.LocalFolder;
            StorageFile textFile = await localFolder.CreateFileAsync(@"\ButtonEinstellungen.xml", CreationCollisionOption.ReplaceExisting);
            using (Stream writeStream = await localFolder.OpenStreamForWriteAsync())
            {
                DataContractSerializer stuffSerializer = new DataContractSerializer(@"\ButtonEinstellungen.xml");

                stuffSerializer.WriteObject(writeStream, @"\ButtonEinstellungen.xml");
                await writeStream.FlushAsync();
                writeStream.Dispose();

                // Erzeugt 4 fehlermeldungen (StorageFolder enthält keine Definition für OpenStreamForWriteAsync)
                // Konvertierung von 'Windows.Storage.StorageFolder' in 'Windows.Storage.IStorageFile' ist nicht möglich.
                // Die beste Übereinstimmung für die überladene 'System.Runtime.Serialization.DataContractSerializer.DataContractSerializer(System.Type)'-Methode hat einige ungültige Argumente.
                // Konvertierung von 'string' in 'System.Type' nicht möglich.
            }*/


            /*StorageFolder localFolder = ApplicationData.Current.LocalFolder;
            StorageFile textFile = await localFolder.CreateFileAsync("ButtonEinstellungen.xml", CreationCollisionOption.ReplaceExisting);

            var Data = Encoding.UTF8.GetBytes("<ButtonEinstellungen></ButtonEinstellungen>");

            using(var stream = await textFile.OpenStreamForWriteAsync())
                await stream.WriteAsync(Data, 0, Data.Length);
            //Speichert wieder nur im Arbeitsspeicher und nicht im Dokument*/


            StorageFolder localFolder = ApplicationData.Current.LocalFolder;
            StorageFile textFile = await localFolder.CreateFileAsync("ButtonEinstellungen.xml", CreationCollisionOption.ReplaceExisting);
            await FileIO.WriteTextAsync(textFile, "<ButtonEinstellungen></ButtonEinstellungen>");

            /*StringBuilder sb = new StringBuilder();
            XmlWriterSettings xws = new XmlWriterSettings();
            xws.OmitXmlDeclaration = true;
            using (XmlWriter xw = XmlWriter.Create(sb, xws))
            {
                XElement root = new XElement("Einstellungen.xml");
                root.Save(xw);
             
             //Speichert wieder nur im Arbeitsspeicher und nicht im Dokument

            }*/


            Debug.WriteLine("Änderungen im XDocument = " + Einstellungen);

            /*StorageFolder localFolder = ApplicationData.Current.LocalFolder;
            StorageFile textFile = await localFolder.CreateFileAsync("Einstellungen.xml", CreationCollisionOption.ReplaceExisting);
            using (IRandomAccessStream textStream = await textFile.OpenAsync(FileAccessMode.ReadWrite))
            {
                using (DataWriter textWriter = new DataWriter(textStream))
                {
                    textWriter.WriteString(ButtonEinstellungen.ToString());
                    await textWriter.StoreAsync();
                }
            }

            Debug.WriteLine("Änderungen im XDocument = " + Einstellungen);*/

            /**
             * 
             * Die Ausgabe lautet:
             * 
             * Änderungen im XDocument = <ButtonEinstellungen>
                <Button>
                <ButtonName>bt_artikel01</ButtonName>
                <ArtikelName>Fisch</ArtikelName>
                <ArtikelMenge>5</ArtikelMenge>
                <EKP>5</EKP>
                <VKP>15</VKP>
                <Buttonfarbe>green</Buttonfarbe>
                </Button>
             * 
             **/


            /*StorageFolder localFolder = ApplicationData.Current.LocalFolder;
            StorageFile textFile = await localFolder.CreateFileAsync(pfad, CreationCollisionOption.ReplaceExisting);
            using (IRandomAccessStream textStream = await textFile.OpenAsync(FileAccessMode.ReadWrite))
            {
                using (DataWriter textWriter = new DataWriter(textStream))
                {
                    textWriter.WriteString(ButtonEinstellungen.ToString());
                    await textWriter.StoreAsync();
                }

                // klappt gar nicht
            }*/


            this.Frame.Navigate(typeof(MainPage));
        }


Um es übersichtlicher zu haben, diese Teile der Methode klappen offenbar ohne Probleme. Denn das ist ja der Teil der die Änderungen im Arbeitsspeicher machen.


ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
private async void EinstellungenSpeichern()
        {
            /**
             * pfad gibt an wo das XML-Dokument liegt
             * var ButtonEinstellungen besagt welches Element geladen werden sollen
             * */

            String pfad = ("ButtonEinstellungen.xml");
            Einstellungen = XDocument.Load(@"ButtonEinstellungen.xml");
            ButtonEinstellungen = XElement.Load(pfad);

            var artikelname = (from p in ButtonEinstellungen.Elements()
                               where p.Element("ButtonName").Value == tbo_ButtonName.Text
                             select p).First();

            artikelname.SetElementValue("ArtikelName", tb_Artikelname_eing.Text);

            var artikelmenge = (from q in ButtonEinstellungen.Elements()
                               where q.Element("ButtonName").Value == tbo_ButtonName.Text
                               select q).First();

            artikelmenge.SetElementValue("ArtikelMenge", tb_Artikelmenge_eing.Text);

            var artikelekp = (from r in ButtonEinstellungen.Elements()
                                where r.Element("ButtonName").Value == tbo_ButtonName.Text
                                select r).First();

            artikelekp.SetElementValue("EKP", tb_EKP_eing.Text);

            var artikelvkp = (from s in ButtonEinstellungen.Elements()
                              where s.Element("ButtonName").Value == tbo_ButtonName.Text
                              select s).First();

            artikelvkp.SetElementValue("VKP", tb_VKP_eing.Text);

            this.Frame.Navigate(typeof(MainPage));
        }
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20448
Erhaltene Danke: 2262

Win 10
C# (VS 2019)
BeitragVerfasst: So 21.08.16 14:56 
Also wirklich übersichtlich ist das nicht, wenn Du ganz viel (auskommentierten) Quelltext postest, der mit dem eigentlich Problem (Datei speichern) nichts zu tun hat und man dazwischen erst einmal die relevanten Stellen finden muss :? Es bringt auch nichts, den funktionierenden Code separat zu posten, denn der funktioniert ja :nixweiss:

Versuch doch mal bitte, den problematischen Code auf möglichst wenige Zeile zu kondensieren und von da aus kann man dann aufbauen. Wie verifizierst Du denn, dass keine Datei geschrieben wurde bzw. schaust Du auch im richtigen Ordner danach? Das hier
ausblenden C#-Quelltext
1:
2:
3:
StorageFolder localFolder = ApplicationData.Current.LocalFolder;
StorageFile textFile = await localFolder.CreateFileAsync("ButtonEinstellungen.xml", CreationCollisionOption.ReplaceExisting);
await FileIO.WriteTextAsync(textFile, "<ButtonEinstellungen></ButtonEinstellungen>");

muss Dir eigentlich eine Datei im LocalFolder Deiner Anwendung erzeugen (zumindest tut es das bei mir). Wo der Ordner liegt, steht übrigens zur Laufzeit in der Path-Eigenschaft von localFolder (mit Debugger kann man dann reingucken).

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".

Für diesen Beitrag haben gedankt: WBergmann
WBergmann Threadstarter
Hält's aus hier
Beiträge: 6

Win 8.1, Android
C# (VS 2013), Java (Android Studio 2.1.3)
BeitragVerfasst: Mo 22.08.16 00:28 
Ja klar macht es Sinn das ganze auskommentierteeug zu posten. Denn nur so lässt sich doppelte Arbeit vermeidenb. Was du vorgeschlagen hast; ist ja schon mein letzter Versuch gewesen Das habe ich ja ersichtlicherweise, mit dem Kommentar gepostet, das es nichts in der Datei ändert.

1. sehe ich das an den Debug.WriteLine()-Ausgaben die in der Methode stehen.
2. sehe ich es im Programm, weil die Button ihren Content aus der XML-Datei beziehen.
3. sehe ich es weil ich jedesmal sämtliche Pfade im Projekt nachschaue.

Visual Studio hat mit die Datei inzwischen in C:\Users\-pfad-\Visual Studio 2013\Projects\projectname\ordner\ButtonEinstellungen.xml,

C:\Users\-pfad-\Visual Studio 2013\Projects\projectname\ordner\bin\Debug\ButtonEinstellungen.xml und in C:\Users\-pfad-\Visual Studio 2013\Projects\projectname\ordner\bin\Debug\AppX\ButtonEinstellungen.xml erstellt.

Gerade der auskommentierte Bereich ist der Bereich der am aufschlußreichsten ist. Denn da habe ich, wie zu sehen, direkt bei geschrieben wie sich die Befehle verhalten und welche Fehlermeldungen auftauchen. Also wieso wird behauptet das es störend ist? Sich seit einer guten Woche im Kreis zu drehen ist störend und frustierend. Aber gewiss nicht Notizen die doppelte Arbeit ersparen.


Zu meinem vorherigen Post zurück, ich bezweifel das irgendwas Asyncron gemacht werden muss, denn alle Anderen Befhle zum auslesen und ähnlichem funktionieren ja auch ohne dem.

Ursprünglich war das Problem das XElement.Save(String) nicht angenommen wurde. Das hat sich scheinbar damit geklärt das es eine UWP-Anwendung ist :zustimm:

Dann fiel auf das der Zugriff auf absolute Pfade verweigert werden :cry:

Nun wurde XElement.Save(StreamWriter) versucht und diverse asyn-Varianten. Da sich beide Wege identisch verhalten (schreiben eben gar nichts in das XML-Datei) aber die Aufrufe Xelement.SetElementValue() die Datei im RAM die ganze Zeit ändert, sollte logischerweise XElement.Save()ausreichend sein, nur aus irgendeinem Grund nicht vollständig. :nixweiss:

Deshalb bitte ich mal von diesem Async distanz zu nehmen.

Also frage ich noch einmal, wer hat eine Idee woran es liegt, das nichts im XML-Dokument verändert wird.

=========================================================================================================

Okay, nun habe ich die Datei unter C:\...\AppData\Local\Packages\72db660c-0785-46c9-a356-1e1275be0534_m82batxptzn62\LocalState\ButtonEinstellungen.xml gefunden. Dort wird sie auch regelmäßig aktuallisiert.

:dance2: :dance2: :dance2:

Dann war mein Verständnis nicht richtig, ich hatte nicht darauf geachtet das es im AppData gespeichert wird.

Da muss ich mich bei Euch endschuldigen für meine Forscheart "Sorry!".

Da der Speicherort aber nur bei mir auf dem Lapi ist, wie kann ich ihn nun individuell auslesen oder wie kann ich einen Speicherpfad bestimmen? Denn da taucht ja wieder das Problem auf, dass mir der Zugriff verweigert wird, wenn ich die Pfade absolut setze. Wenn der Speicherpfad relativ ist, speichert er es ja nicht in der ursprünglichen Datei...
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 22.08.16 02:53 
- Nachträglich durch die Entwickler-Ecke gelöscht -

Für diesen Beitrag haben gedankt: WBergmann
WBergmann Threadstarter
Hält's aus hier
Beiträge: 6

Win 8.1, Android
C# (VS 2013), Java (Android Studio 2.1.3)
BeitragVerfasst: Mo 22.08.16 05:08 
@ Frühloingsrolle

Danke für deine Antwort, jedoch gibt es in meinem NameSpace weder GetFolderPath noch SpecialFolder.

Ich habe es nun so geändert:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
StorageFile file = await KnownFolders.PicturesLibrary.CreateFileAsync("ButtonEinstellungen.xml", CreationCollisionOption.ReplaceExisting);
            
            using (var stream = await file.OpenStreamForWriteAsync())
            {
                ButtonEinstellungen.Save(stream);
                stream.Flush();
            }


eigentlich wollte ich DocumentsLibrary wählen, aber aus irgendeinem Grund gibt es diese nicht zur Auswahl in der Manifestdatei.

Somit sieht meine komplette Methode zum Speichern wie Folgt aus:

ausblenden volle Höhe C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
private async void EinstellungenSpeichern()
        {
            /**
             * pfad gibt an wo das XML-Dokument liegt
             * var ButtonEinstellungen besagt welches Element geladen werden sollen
             * SetElementValue ändert den entsprechenden Wert des XElementes
             * */

            String pfad = (@"C:\Users\Wilfried\Pictures\ButtonEinstellungen.xml");
            Einstellungen = XDocument.Load(pfad);
            ButtonEinstellungen = XElement.Load(pfad);

            var artikelname = (from p in ButtonEinstellungen.Elements()
                               where p.Element("ButtonName").Value == tbo_ButtonName.Text
                             select p).First();

            artikelname.SetElementValue("ArtikelName", tb_Artikelname_eing.Text);

            var artikelmenge = (from q in ButtonEinstellungen.Elements()
                               where q.Element("ButtonName").Value == tbo_ButtonName.Text
                               select q).First();

            artikelmenge.SetElementValue("ArtikelMenge", tb_Artikelmenge_eing.Text);

            var artikelekp = (from r in ButtonEinstellungen.Elements()
                                where r.Element("ButtonName").Value == tbo_ButtonName.Text
                                select r).First();

            artikelekp.SetElementValue("EKP", tb_EKP_eing.Text);

            var artikelvkp = (from s in ButtonEinstellungen.Elements()
                              where s.Element("ButtonName").Value == tbo_ButtonName.Text
                              select s).First();

            artikelvkp.SetElementValue("VKP", tb_VKP_eing.Text);

            var artikelfarbe = (from t in ButtonEinstellungen.Elements()
                                where t.Element("ButtonName").Value == tbo_ButtonName.Text
                                select t).First();

            artikelfarbe.SetElementValue("Buttonfarbe", tb_Artikelfarbe_eing.Text);

            /**
             * StorageFile benennt den Speicherpfad und die Vorgehensweise wenn die Datei schon vorhanden ist
             **/

            StorageFile file = await KnownFolders.PicturesLibrary.CreateFileAsync(pfad, CreationCollisionOption.ReplaceExisting);
            
            /**
             * Stream zum schreiben wird erstellt...
             **/

            using (var stream = await file.OpenStreamForWriteAsync())
            {
                /**
                 * Änderungen werden gespeichert und der Stream beendet
                 **/

                ButtonEinstellungen.Save(stream);
                stream.Flush();
            }

            // Die MainPage wird aufgerufen
            this.Frame.Navigate(typeof(MainPage));
        }


Jetzt fehlt mir nur noch das Speichern in einem User-Unabhängigen-Pfad. Also wenn ich eine öffentliche Bibliothek verwenden kann, würde es mir vollkommen ausreichen. Aber die KnownFolders-Variante unterscheidet nicht zwischen public und private. Sie geht direkt auf Private...

Ich denke das ist jetzt auch nicht mehr die ursprüngliche Frage.

Ich bedanke mich nochmal für die reichliche Unterstützung und denke das das Problem nun gelöst ist. :flehan: :D