Autor Beitrag
M0rgenstern
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Fr 09.09.11 20:11 
Hallo Liebe Community,
Ich habe ein Problem
Udnd zwar bin ich gerade dabei zu Lernzwecken eine "Kundenverwaltung" zu schreiben.
Im Prinzip ist es eine Kontaktsammlung mit einer XML-Datenbank.
Das ganze funktioniert folgendermaßen: Wenn das Programm gestartet wird, dann wird eine XML-Datei ausgelesen (per Deserialisierung) und somit die Kunden in eine Tabelle eingetragen und in eine Liste geladen.
Wenn das Programm geschlossen wir, werden alle Kunden nochmal Serialisiert und die Datei wird überschrieben.
Das ganze funktioniert mit folgenden Methoden:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
 public static void Save_Clients(string sPath)
        {
            XmlSerializer Serializer = new XmlSerializer(typeof(Client));
            FileStream Stream = new FileStream(sPath + sFileName, FileMode.Create);
            foreach (Client cClient in lAllClients)
                Serializer.Serialize(Stream, cClient);
            Stream.Close();
        }

        public static void Load_Clients(string sPath)
        {
            XmlSerializer Serializer = new XmlSerializer(typeof(Client));
            StreamReader Stream = new StreamReader(sPath + sFileName);
            Client newClient;
            while (!Stream.EndOfStream)
                newClient = (Client)Serializer.Deserialize(Stream);
            Stream.Close();
        }


Leider sagt er mir beim Speichern (Save_Clients) in der Zeile "FileStream Stream = [...]" den Fehler:
Zitat:
Der Prozess kann nicht auf die Datei "D:\Programmierung\C#\Kundenverwaltung\Kundenverwaltung\bin\DebugKunden_Datenbank.xml" zugreifen, da sie von einem anderen Prozess verwendet wird.


Ich habe in beiden Methoden ein Close() am Ende. Ich weiß echt nicht, woran es liegt.

Kann mir vielleicht jemand helfen?

Lg, M0rgenstern


Moderiert von user profile iconTh69: Topic aus Basistechnologien verschoben am Fr 09.09.2011 um 20:37
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4799
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 09.09.11 20:36 
Hallo,

schau dir mal genau den Pfad in der Fehlermeldung an.
Verwende also Path.Combine() zum Zusammenfügen von Pfaden (anstatt per +).

Den eigentlichen Fehler erklärt dies jedoch noch nicht...

Daher noch zwei Tipps:
1. Verwende
ausblenden C#-Quelltext
1:
2:
3:
4:
using(FileStream Stream = ...)
{

}

um auch bei einer möglichen Exception die Datei wieder zu schließen (d.h. ein explizites Close() ist nicht mehr notwendig).

2. Deine erzeugte XML-Datei ist nicht XML-konform, da du mittels Serialize() immer wieder den Header schreibst.

Besser ist es du serialisierst gleich die ganze Liste als:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
XmlSerializer serializer = new XmlSerializer(typeof(List<Client>));

using(FileStream stream = new FileStream(Path.Combine(sPath, sFileName), FileMode.Create))
{
  serializer.Serialize(stream, lAllClients);
}

(ich nehme mal an lAllClients ist vom Typ List<Client>).

Und du kriegst noch einen Tipp zum Schluß geschenkt ;-):
Lokale Variablen sollten mit einem Kleinbuchstaben anfangen und evtl. noch 'lAllClients' in 'listClients' bzw. 'clientsList' umbenennen...

Und ich verschiebe diesen Thread mal nach "IO, XML und Registry"...
M0rgenstern Threadstarter
Hält's aus hier
Beiträge: 11



BeitragVerfasst: Sa 10.09.11 14:42 
Hey Th69,
Vielen Dank für die Antwort.
Entschuldigung erstmal, dass das im falschen Themenbereich gelandet ist.

Dank dir bekomme ich keine Fehlermeldung mehr.
Aber: Das Deserialisieren klappt nur bedingt.
Irgendwie wird nur die erste Person ausgelesen und sonst nichts, obwohl in der XML-Datei auf jeden Fall mehr Personen drin stehen.

Die Funktionen sehen jetzt so aus:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
 public static void Save_Clients(string sPath)
        {
            XmlSerializer serializer = new XmlSerializer(typeof(List<Client>));
            using (FileStream stream = new FileStream(Path.Combine(sPath, sFileName), FileMode.Create))
            {
                serializer.Serialize(stream, ClientsList);
            }
        }

        public static void Load_Clients(string sPath)
        {
            XmlSerializer serializer = new XmlSerializer(typeof(List<Client>));
            using (FileStream stream = new FileStream(Path.Combine(sPath, sFileName), FileMode.Open))
            {
                ClientsList = (List<Client>)serializer.Deserialize(stream);
            }
        }


Das Problem lag ja nicht in der Save, sondern in der Load-Funktion, denn letztere hat ja die Datei scheinbar nicht freigegeben.
Kann mir nochmal jemand helfen bitte? Wie gesagt, das ist das ertse mal, dass ich mit Serialisierung arbeite.

Lg, M0rgenstern

Edit: In der Liste stecken aber zwei Personen, ich glaube also es liegt an was anderem. Werde das gleich prüfen.
Edit: Problem gelöst.
Funktioniert alles.
Vielen Dank für die Hilfe