IOException v C# - soubor je využíván jiným procesem

Hanz

Dobrý den, v testovacím projektu mám následující kód (není odladěný pro cestu v xml, ale tím to nebude). Vytvářím synchnně objekt a volá se konstruktor s parametrem cesty k souboru, ale u xmlDoc.Save(fileName) to hlásí chybu IOException, co je v titulku, ale mně je to nepochopitelné. Nevíte, prosím, čím by to mohlo být způsobené? Při synchronním volání? Děkuji předem. H.

Kód je následující:

Kód: [Vybrat]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.IO;

namespace TestXml
{
    public class HighScoreData
    {
        private string fileName;

        private XmlDocument xmlDoc;

        private string pathInXml = "ArkanoidHighScore";

        private HighScoreData()
        {
        }

        public HighScoreData(string fileName)
        {
            this.fileName = fileName;

            xmlDoc = new XmlDocument();

            if (!File.Exists(fileName))
            {
                File.Create(fileName);

                XmlDeclaration xmlDeclaration = xmlDoc.CreateXmlDeclaration("1.0", "UTF-8", null);

                XmlElement root = xmlDoc.DocumentElement;
                xmlDoc.InsertBefore(xmlDeclaration, root);

                XmlElement childElement = xmlDoc.CreateElement(string.Empty, "ArkanoidHighScore", string.Empty);
                xmlDoc.AppendChild(childElement);

                xmlDoc.Save(fileName);
            }
        }

        public int LoadHighScore()
        {
            int highScore = 0;

            xmlDoc.Load(fileName);

            XmlNode node = xmlDoc.SelectSingleNode(pathInXml);

            highScore = int.Parse(node.InnerText);

            return highScore;
        }

        public void SaveHighScore(int score)
        {
            xmlDoc.Load(fileName);

            XmlNode xmlNode = xmlDoc.SelectSingleNode(pathInXml);

            if (xmlNode != null)
            {
                xmlNode.InnerText = score.ToString();
            }

            xmlDoc.Save(fileName);
        }

    }
}




Kit

Re:IOException v C# - soubor je využíván jiným procesem
« Odpověď #1 kdy: 18. 02. 2015, 21:14:12 »
Vyhoď řádek
Kód: [Vybrat]
File.Create(fileName);

Hanz

Re:IOException v C# - soubor je využíván jiným procesem
« Odpověď #2 kdy: 18. 02. 2015, 21:17:19 »
Měl jste pravdu, díky moc. H.

lobo

Re:IOException v C# - soubor je využíván jiným procesem
« Odpověď #3 kdy: 19. 02. 2015, 00:33:59 »
nechcem ti toho nejako extra kecat, ale podla mna to robis extra komplikovane... preco parsujes XML manualne???
Kód: [Vybrat]

void Main()
{
HighScore myObject = new HighScore();
myObject.Name="HS";
myObject.Value=102;

XMLHelper.WriteXML(myObject,"aaaaa.xml");
var HighScoreFromFile=XMLHelper.ReadXML("aaaaa.xml");
}

public class HighScore
{
    [XmlAttribute]
    public string Name;
    public int Value;
}
public static class XMLHelper{

public static void WriteXML(HighScore objectToWrite, string fileName){
var mySerializer = new XmlSerializer(typeof(HighScore));
using(var myWriter = new StreamWriter(fileName)){
mySerializer.Serialize(myWriter, objectToWrite);
}
}

public static HighScore ReadXML(string fileName){
var mySerializer = new XmlSerializer(typeof(HighScore));
HighScore retVal;
using(var myWriter = new StreamReader(fileName)){
retVal=(HighScore)mySerializer.Deserialize(myWriter);
}
return retVal;
}
}

lobo

Re:IOException v C# - soubor je využíván jiným procesem
« Odpověď #4 kdy: 19. 02. 2015, 01:21:37 »
alebo este o trosku univerzalnejsie
Kód: [Vybrat]
void Main()
{
HighScore myObject = new HighScore();
myObject.Name="HS";
myObject.Value=102;

XMLHelper.WriteXML(myObject,"aaaaa.xml");
var HighScoreFromFile=XMLHelper.ReadXML<HighScore>("aaaaa.xml");
}

public class HighScore
{
    [XmlAttribute]
    public string Name;
public int Value;
}
public static class XMLHelper{

public static void WriteXML<T>(T objectToWrite, string fileName){
var mySerializer = new XmlSerializer(typeof(T));
using(var myWriter = new StreamWriter(fileName)){
mySerializer.Serialize(myWriter, objectToWrite);
}
}

public static T ReadXML<T>(string fileName){
var mySerializer = new XmlSerializer(typeof(T));
T retVal;
using(var myWriter = new StreamReader(fileName)){
retVal=(T)mySerializer.Deserialize(myWriter);
}
return retVal;
}
}