Laden...

Datei kann nicht geladen werden, weil sie noch im Zugriff ist

Erstellt von MalleBuchsbaum vor 14 Jahren Letzter Beitrag vor 13 Jahren 7.128 Views
M
MalleBuchsbaum Themenstarter:in
12 Beiträge seit 2010
vor 14 Jahren
Datei kann nicht geladen werden, weil sie noch im Zugriff ist

Hallo liebes Forum!
Ich habe mich eben angemeldet, da ich ein Problem mit meinem Programm habe.
Ich arbeite zur Zeit an einem Energierechener der die Stromkosten für ein ganzes Haus errechnet und in dem der Tausch von z.B. Lampen durch Engeriesparlampen protokolliert wird.
Den Text speichere ich in einer XML ab und rufen ihn, falls vorhanden, wieder ab.

Da liegt aber mein Problem:
Der Prozess kann nicht auf die Datei "C:\XML\Daten_I.xml" zugreifen, da sie von einem anderen Prozess verwendet wird.

Der "LoadData"-Code:

 
           
private void LoadData()
        {
            XmlReader reader = XmlReader.Create("C:\\XML\\Daten_I.xml");

            reader.ReadStartElement();
            reader.ReadStartElement("Einstellungen");
            string Einstellungen = reader.ReadString();
            reader.ReadEndElement();
            reader.ReadStartElement("Name");
            string Name = reader.ReadString();
            reader.ReadEndElement();
            reader.ReadStartElement("Stromanbieter");
            string Stromanbieter = reader.ReadString();
            reader.ReadEndElement();
            reader.ReadStartElement("Preis");
            decimal Preis = decimal.Parse(reader.ReadString());
            reader.ReadEndElement();
            reader.ReadEndElement();
            reader.Close();

            textBox1.Text = Name;
            comboBox1.Text = Stromanbieter;
            numericUpDown1.Value = Preis;
         }         


Die Datei wird erstellt, dann aber tritt der oben gennate Fehler auf.
Da ich Neuling bin und noch nicht sehr viel Erfahrung habe, finde ich den Fehler einfach nicht... Ich habe auch schon in "Das C# 2008 Codebook" nachgeguckt, aber nichts gefunden... Ich habe auch schon versucht das @"C:\XML\Daten_I.xml" durch "C:\XML\Daten_I.xml" zu ersetzen, aber vergeblich.

Sorry ... Ich bin Neuling!

Gelöschter Account
vor 14 Jahren

die fehlermeldung sagt doch einfach alles... du hast irgendwo noch eine anwendung, die auf diese datei zugreift und daher kannst du sie nciht öffnen.

M
MalleBuchsbaum Themenstarter:in
12 Beiträge seit 2010
vor 14 Jahren

Ja... Es ist aber egal wo ich die Datei hinschreibe, auf den Desktop oder sonst wo, immer das gleiche! Was für ein Programm könnte das den sein? Hat jemand eine Idee?

Sorry ... Ich bin Neuling!

5.299 Beiträge seit 2008
vor 14 Jahren

ich würde halt deine eigene app verdächtigen. Also dass du iwo einen lese-Zugriff machst, und den nicht wieder freigibst.
In deinem post sagst du auch, du zeigest die Load-Methode, aber das ist wohl eine Save-Methode, odr?

Der frühe Apfel fängt den Wurm.

M
MalleBuchsbaum Themenstarter:in
12 Beiträge seit 2010
vor 14 Jahren

Das kann sein, aber wo???

Nochmal der Code:



using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using System.IO;

namespace Energie_Rechner
{
    public partial class Einstellungen : Form
    {
        string gespeichert = "C:\\XML\\Daten_I.xml";

        public Einstellungen()
        {
            InitializeComponent();
        }

        private void LoadData()
        {
            XmlReader reader = XmlReader.Create("C:\\XML\\Daten_I.xml");

            reader.ReadStartElement();
            reader.ReadStartElement("Einstellungen");
            string Einstellungen = reader.ReadString();
            reader.ReadEndElement();
            reader.ReadStartElement("Name");
            string Name = reader.ReadString();
            reader.ReadEndElement();
            reader.ReadStartElement("Stromanbieter");
            string Stromanbieter = reader.ReadString();
            reader.ReadEndElement();
            reader.ReadStartElement("Preis");
            decimal Preis = decimal.Parse(reader.ReadString());
            reader.ReadEndElement();
            reader.ReadEndElement();
            reader.Close();

            textBox1.Text = Name;
            comboBox1.Text = Stromanbieter;
            numericUpDown1.Value = Preis;
         }

        private void WriteData()
         {
             // speichern
             XmlWriter writer = XmlWriter.Create("C:\\XML\\Daten_I.xml", new XmlWriterSettings() { Indent = true, NewLineChars = Environment.NewLine });
             writer.WriteStartDocument();
             // <?xml ...?>
             writer.WriteStartElement("Einstellungen");
             writer.WriteStartElement("Name");
             writer.WriteString(textBox1.Text);
             writer.WriteEndElement();
             writer.WriteStartElement("Stromanbieter");
             writer.WriteString(comboBox1.Text);
             writer.WriteEndElement();
             writer.WriteStartElement("Preis");
             writer.WriteString(numericUpDown1.Value.ToString());
             writer.WriteEndElement();
             writer.WriteEndElement();
             writer.WriteEndDocument();
             writer.Close();
             writer.Close();
             
         }
        
        private void button2_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            WriteData();

            Rechenfenster form1 = new Rechenfenster();
            Einstellungen form2 = new Einstellungen();
             form1.Show();
             form2.Close();
        }

        private void Einstellungen_Load(object sender, EventArgs e)
        {
            if (File.Exists(gespeichert))
            {
                LoadData();
            }
        }
       
    }
}


Sorry ... Ich bin Neuling!

5.299 Beiträge seit 2008
vor 14 Jahren

warum steht in writeData writer.close 2 mal hinternander?

  
        private void button1_Click(object sender, EventArgs e)  
        {  
            WriteData();  
  
            Rechenfenster form1 = new Rechenfenster();  
            Einstellungen form2 = new Einstellungen();  
             form1.Show();  
             form2.Close();  
        }  

greift Rechenfenster auch auf die Datei zu?

form2 wird neu erstellt, aber nie angezeigt. In seinem Form_Load liest es aber auch die Datei. Und dann gleich wieder geschlossen.

Also da wird in extrem kurzer Zeit erst reingeschrieben, und dann ausgelesen, schmeiß doch man das form2 da raus, das tut eh nix sinnvolles.

Der frühe Apfel fängt den Wurm.

M
MalleBuchsbaum Themenstarter:in
12 Beiträge seit 2010
vor 14 Jahren

Hallo,
danke für die Antwort! Ich benötige From2 auf jeden Fall, da dort die Änderung u.ä. eingetragen & gespeichert werden. Bei button1_Click wird in meine XML geschrieben und es wird das Rechenfenster (form1) angezeigt. Darauhin wird form2 (Einstellungen) geschlossen. Mache ich nur einen Denkfehler???

Sorry ... Ich bin Neuling!

5.299 Beiträge seit 2008
vor 14 Jahren

evtl., jedenfalls kannich deinen Ausführungen nicht wirklich folgen:

   private void button1_Click(object sender, EventArgs e)
        {
//Bei button1_Click wird in meine XML geschrieben und es wird das Rechenfenster (form1) angezeigt.
            WriteData();
            Rechenfenster form1 = new Rechenfenster();
             form1.Show();
//ok

//Darauhin wird form2 (Einstellungen) geschlossen.
            Einstellungen form2 = new Einstellungen();
             form2.Close();
//nein. es wird ein neues Einstellungen - Objekt erzeugt und gleich geschlossen - was soll das?
        }

Wenn du das aktuelle Form schließen willst, erzeuge bitte kein neues, sondern verwende einfach this.Close().

Der frühe Apfel fängt den Wurm.

M
MalleBuchsbaum Themenstarter:in
12 Beiträge seit 2010
vor 14 Jahren

Ok, ich habe jetzt


this.Close();

eingesetzt. Das Problem tritt aber immer noch auf...

System.IO.IOException wurde nicht behandelt.
Message=Der Prozess kann nicht auf die Datei "C:\XML\Daten_I.xml" zugreifen, da sie von einem anderen Prozess verwendet wird.
Source=mscorlib
StackTrace:
bei System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
bei System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy)
bei System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share)
bei System.Xml.XmlWriter.Create(String outputFileName, XmlWriterSettings settings)
bei Energie_Rechner_v2.Einstellungen.WriteData() in C:\Users\Malte\documents\visual studio 2010\Projects\Energie-Rechner_v2\Energie-Rechner_v2\Einstellungen.cs:Zeile 51.
bei Energie_Rechner_v2.Einstellungen.button1_Click(Object sender, EventArgs e) in C:\Users\Malte\documents\visual studio 2010\Projects\Energie-Rechner_v2\Energie-Rechner_v2\Einstellungen.cs:Zeile 78.
bei System.Windows.Forms.Control.OnClick(EventArgs e)
bei System.Windows.Forms.Button.OnClick(EventArgs e)
bei System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
bei System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
bei System.Windows.Forms.Control.WndProc(Message& m)
bei System.Windows.Forms.ButtonBase.WndProc(Message& m)
bei System.Windows.Forms.Button.WndProc(Message& m)
bei System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
bei System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
bei System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
bei System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
bei System.Windows.Forms.Application.ComponentManager. System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop (Int32 dwComponentID, Int32 reason, Int32 pvLoopData)
bei System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
bei System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
bei System.Windows.Forms.Application.Run(Form mainForm)
bei Energie_Rechner_v2.Program.Main() in C:\Users\Malte\documents\visual studio 2010\Projects\Energie-Rechner_v2\Energie-Rechner_v2\Program.cs:Zeile 18.
bei System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
bei System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
bei Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
bei System.Threading.ThreadHelper.ThreadStart_Context(Object state)
bei System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
bei System.Threading.ThreadHelper.ThreadStart()
InnerException:

Das ist die Meludng. Ich weiß wirklich nicht weiter!

Sorry ... Ich bin Neuling!

5.299 Beiträge seit 2008
vor 14 Jahren

Hmm - könnte sein, dass beim XmlReader Close() nicht mit Dispose() austauschbar ist?
Also probierma, den XmlReader in einem using-block zu verwenden, sowas:


using (XmlReader reader = XmlReader.Create("C:\\XML\\Daten_I.xml")){
//reader-code
}

und den writer natürlich ebenso.

Der frühe Apfel fängt den Wurm.

479 Beiträge seit 2008
vor 14 Jahren

Tach Malte,

Probleme mit meinen Code...komisch^^

Hab dir mal das using eingebaut, so müsste es klappen:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Xml;
using System.IO;

namespace Energie_Rechner
{
    public partial class Einstellungen : Form
    {
        string gespeichert = "C:\\XML\\Daten_I.xml";

        public Einstellungen()
        {
            InitializeComponent();
        }

        private void LoadData()
        {
            using (XmlReader reader = XmlReader.Create("C:\\XML\\Daten_I.xml"))
            {
                reader.ReadStartElement();
                reader.ReadStartElement("Einstellungen");
                string Einstellungen = reader.ReadString();
                reader.ReadEndElement();
                reader.ReadStartElement("Name");
                string Name = reader.ReadString();
                reader.ReadEndElement();
                reader.ReadStartElement("Stromanbieter");
                string Stromanbieter = reader.ReadString();
                reader.ReadEndElement();
                reader.ReadStartElement("Preis");
                decimal Preis = decimal.Parse(reader.ReadString());
                reader.ReadEndElement();
                reader.ReadEndElement();
            }

            textBox1.Text = Name;
            comboBox1.Text = Stromanbieter;
            numericUpDown1.Value = Preis;
        }

        private void WriteData()
        {
            // speichern
            using (XmlWriter writer = XmlWriter.Create("C:\\XML\\Daten_I.xml", new XmlWriterSettings() { Indent = true, NewLineChars = Environment.NewLine }))
            {
                writer.WriteStartDocument();
                // <?xml ...?>
                writer.WriteStartElement("Einstellungen");
                writer.WriteStartElement("Name");
                writer.WriteString(textBox1.Text);
                writer.WriteEndElement();
                writer.WriteStartElement("Stromanbieter");
                writer.WriteString(comboBox1.Text);
                writer.WriteEndElement();
                writer.WriteStartElement("Preis");
                writer.WriteString(numericUpDown1.Value.ToString());
                writer.WriteEndElement();
                writer.WriteEndElement();
                writer.WriteEndDocument();
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            Application.Exit();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            WriteData();
            Rechenfenster form1 = new Rechenfenster();
            form1.Show();
            this.Close();
        }

        private void Einstellungen_Load(object sender, EventArgs e)
        {
            if (File.Exists(gespeichert))
            {
                LoadData();
            }
        }

    }
}

Sorry, mein fehler, hab ihm das mit den using falsch erklärt

mfg.
markus111 (du kennst mich 😛)

EDIT: Code formatiert

[Follow me on Twitter](http://twitter.com/blendingsky)
M
MalleBuchsbaum Themenstarter:in
12 Beiträge seit 2010
vor 13 Jahren

Vielen Dank,
ja Markus, ich kenne dich in der Tat. Ich werde den Code glecih mal testen!
Danke,
MalleBuchsbaum

Sorry ... Ich bin Neuling!

M
MalleBuchsbaum Themenstarter:in
12 Beiträge seit 2010
vor 13 Jahren

Nein... Leider nicht! Es kommt folgenden Meldung: Ein Teil der Datein konnt nicht gefunden werden..."+Pfad("C//usw)...

Sorry ... Ich bin Neuling!

479 Beiträge seit 2008
vor 13 Jahren

Hallo,

Lädst du die Dateien auch in einer anderen Form?

mfg.
markus111

[Follow me on Twitter](http://twitter.com/blendingsky)
5.299 Beiträge seit 2008
vor 13 Jahren

hmm, also mir gehen die Ideen aus, und ich kann den Fehler auch nicht reproduzieren (v.a., weil ich das Xml nicht habe).
Malle, kannst du vlt. die Solution zippen, oder ein Sample basteln mit dem Fehler, und anhängen? Aber vollständig, und lauffähig müsste es sein.

Der frühe Apfel fängt den Wurm.

M
MalleBuchsbaum Themenstarter:in
12 Beiträge seit 2010
vor 13 Jahren

So, ich habe jetzt noch mal den Code von markus111 eingefügt und es kommen folgende Meldungen:

Fehler 4 "Name" verursacht einen Konflikt mit der Deklaration "System.Windows.Forms.Control.Name". C:\Users\Malte\documents\visual studio 2010\Projects\Energie-Rechner_v2\Energie-Rechner_v2\Einstellungen.cs 43 29 Energie-Rechner_v2
Fehler 6 Der Name "Preis" ist im aktuellen Kontext nicht vorhanden. C:\Users\Malte\documents\visual studio 2010\Projects\Energie-Rechner_v2\Energie-Rechner_v2\Einstellungen.cs 45 36 Energie-Rechner_v2
Fehler 5 Der Name "Stromanbieter" ist im aktuellen Kontext nicht vorhanden. C:\Users\Malte\documents\visual studio 2010\Projects\Energie-Rechner_v2\Energie-Rechner_v2\Einstellungen.cs 44 30 Energie-Rechner_v2
Fehler 3 Der Typ- oder Namespacename "Einstellungen" konnte nicht gefunden werden. (Fehlt eine Using-Direktive oder ein Assemblyverweis?) C:\Users\Malte\documents\visual studio 2010\Projects\Energie-Rechner_v2\Energie-Rechner_v2\Program.cs 18 33 Energie-Rechner_v2
Fehler 7 Der Typ- oder Namespacename "Rechenfenster" konnte nicht gefunden werden. (Fehlt eine Using-Direktive oder ein Assemblyverweis?) C:\Users\Malte\documents\visual studio 2010\Projects\Energie-Rechner_v2\Energie-Rechner_v2\Einstellungen.cs 78 13 Energie-Rechner_v2
Fehler 8 Der Typ- oder Namespacename "Rechenfenster" konnte nicht gefunden werden. (Fehlt eine Using-Direktive oder ein Assemblyverweis?) C:\Users\Malte\documents\visual studio 2010\Projects\Energie-Rechner_v2\Energie-Rechner_v2\Einstellungen.cs 78 39 Energie-Rechner_v2

Lieg es vllt. daran das ich VS2010 Beta2 verwenden? Sin das noch Bugs in VS?

Sorry ... Ich bin Neuling!

49.485 Beiträge seit 2005
vor 13 Jahren
M
MalleBuchsbaum Themenstarter:in
12 Beiträge seit 2010
vor 13 Jahren

Vielen Dank herbivore,
MSDN erzählt mir da leider etwas von Websites und NET.Farmework 1.1...
Das wird es höchstwahrscheinlich nicht sein. Ich habe echt keinen Plan mehr... Soll ich den Rechner einfach mal zippen & dann hochladen?

Sorry ... Ich bin Neuling!

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo MalleBuchsbaum,

du solltest erstmal versuchen, ein minimales Projekt zu erstellen, das den Fehler zeigt. Dabei ist es sehr wahrscheinlich, dass du selber die Ursache findest. Wenn nicht, kannst du das minimale Projekt anhängen.

herbivore

M
MalleBuchsbaum Themenstarter:in
12 Beiträge seit 2010
vor 13 Jahren

Jetzt binh ich volkommen weg... Jetzt check ich garnichts mehr. Ich habe den Code aus meinem Rechner kopiert und nur das combobox & numupdown weggenommen und im minimalen Projekt funzt es... KP warum!

Sorry ... Ich bin Neuling!

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo MalleBuchsbaum,

ich finde das nicht verwunderlich, sondern habe genau das erwartet. Jetzt geht es darum, dass du Schritt für Schritt den Code aus dem eine Projekt in das andere Projekt einfügst, bis der Fehler auftritt bzw. andersherum Schritt für Schritt Code aus dem einen Projekt entfernst, bist der Fehler nicht mehr auftritt.

herbivore

M
MalleBuchsbaum Themenstarter:in
12 Beiträge seit 2010
vor 13 Jahren

Ja, ich werde den XML-Writer & Reader Code nochmal neu schreiben 😉 Danke für die tolle Hilfe!

EDIT: Habs geschafft! THX@all!

Sorry ... Ich bin Neuling!