使用streamreader后,即使关闭streamreader,路径仍然不可用

问题描述 投票:0回答:2

我为学校制作了一个小游戏,并且一切都按预期工作,但是当“ ITAMons”(这就是我们所说的)升级到if语句被访问并且流编写器正在尝试写入由一个streamreader,但是streamreader已关闭,但仍然说我无法访问该文件,因为它仍在使用中。

StreamReaders是在文档本身中定义的,在这里它们被定义,然后在ITAMon构造函数中使用

sr = new StreamReader(Zielordner.Text + "\\" + ITAListe.CheckedItems[0].ToString());
sr2 = new StreamReader(Zielordner.Text + "\\" + ITAListe2.CheckedItems[0].ToString());
ITAMon1 = new ITAMon(sr);
ITAMon2 = new ITAMon(sr2);

其结尾为sr.Close()

这里是整个构造函数:

public ITAMon(StreamReader sr)
{
    ITAName = sr.ReadLine();
    if (ITAName == String.Empty)
    {
        bool falsch = false;
        Debug.Assert(falsch, "Auslesefehler! Bitte überprüfen Sie Ihre Datei!");
    }
    string[] Auslesung = sr.ReadLine().Split(';');
    if (Auslesung.Length > 6)
    {
        switch (Auslesung[0])
        {
            case "Feuer":
                Element = Element.Feuer;
                break;
            case "Wasser":
                Element = Element.Wasser;
                break;
            case "Pflanze":
                Element = Element.Pflanze;
                break;
            default:
                Element = Element.Normal;
                break;
        }
        Level = Convert.ToInt32(Auslesung[1]);
        Leben = Convert.ToDouble(Auslesung[2]);
        CurrentLife = Leben;
        EXP = Convert.ToInt32(Auslesung[3]);
        Look = Auslesung[4];
        BaseDmg = Convert.ToInt32(Auslesung[5]);
        Verteidigung = Convert.ToDouble(Auslesung[6]);
        Geschwindigkeit = Convert.ToDouble(Auslesung[7]);
        Erweitert = true;
    }

    else if (Auslesung.Length < 7)
    {

        switch (Auslesung[0])
        {
            case "Feuer":
                Element = Element.Feuer;
                break;
            case "Wasser":
                Element = Element.Wasser;
                break;
            case "Pflanze":
                Element = Element.Pflanze;
                break;
            default:
                Element = Element.Normal;
                break;
        }
        Level = Convert.ToInt32(Auslesung[1]);
        Leben = Convert.ToDouble(Auslesung[2]);
        CurrentLife = Leben;
        EXP = Convert.ToInt32(Auslesung[3]);
        Look = Auslesung[4];
        Erweitert = false;
    }
    string[] Attacke1 = sr.ReadLine().Split(';');
    if (Attacke1.Length != 4)
    {
        bool falsch = false;
        Debug.Assert(falsch, "Auslesefehler! Bitte überprüfen Sie Ihre Datei!");
    }
    Attacken[0] = new Attacke(Attacke1[0], Convert.ToInt32(Attacke1[1]), Convert.ToInt32(Attacke1[3]), Convert.ToInt32(Attacke1[2]));
    string[] Attacke2 = sr.ReadLine().Split(';');
    if (Attacke2.Length != 4)
    {
        bool falsch = false;
        Debug.Assert(falsch, "Auslesefehler! Bitte überprüfen Sie Ihre Datei!");
    }
    Attacken[1] = new Attacke(Attacke2[0], Convert.ToInt32(Attacke2[1]), Convert.ToInt32(Attacke2[3]), Convert.ToInt32(Attacke2[2]));
    string[] Attacke3 = sr.ReadLine().Split(';');
    if (Attacke3.Length != 4)
    {
        bool falsch = false;
        Debug.Assert(falsch, "Auslesefehler! Bitte überprüfen Sie Ihre Datei!");
    }
    Attacken[2] = new Attacke(Attacke3[0], Convert.ToInt32(Attacke3[1]), Convert.ToInt32(Attacke3[3]), Convert.ToInt32(Attacke3[2]));
    string[] Attacke4 = sr.ReadLine().Split(';');
    if (Attacke4.Length != 4)
    {
        bool falsch = false;
        Debug.Assert(falsch, "Auslesefehler! Bitte überprüfen Sie Ihre Datei!");
    }
    Attacken[3] = new Attacke(Attacke4[0], Convert.ToInt32(Attacke4[1]), Convert.ToInt32(Attacke4[3]), Convert.ToInt32(Attacke4[2]));

    sr.Close();
}

尽管sr.Close()仍然说出了访问此if语句并且streamwriter试图使用该路径时正在使用的路径。

    if (ITAMon1.CrtLife <= 0 || ITAMon1.GetAttacken[0].Mgz == 0 & ITAMon1.GetAttacken[1].Mgz == 0 & ITAMon1.GetAttacken[2].Mgz == 0 & ITAMon1.GetAttacken[3].Mgz == 0)
    {
    // This Line srG is a streamwriter despite the name
    srG = new StreamWriter(Zielordner.Text + "\\" + ITAListe2.CheckedItems[0].ToString());
        EventLog.Text = ITAMon2.GetName + " Gewinnt!";
        ITAMon2.GetEXP += ITAMon2.GetGegner.GetLevel;
        if(ITAMon2.LvlUp())
        {
            Gewinner = ITAMon2;
            MessageBox.Show(ITAMon2.GetName + " hat das nächste Level erreicht!", "LevelUp", MessageBoxButtons.OK, MessageBoxIcon.Information);

            LevelUp levelUp = new LevelUp();
            levelUp.Show();
        }
        else
        {

            ITAMon2.Save(srG);
            this.Close();
            MessageBox.Show(ITAMon2.GetName + " Gewinnt!", "Gewinner", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
    }
    else if (ITAMon2.CrtLife <= 0 || ITAMon2.GetAttacken[0].Mgz == 0 & ITAMon2.GetAttacken[1].Mgz == 0 & ITAMon2.GetAttacken[2].Mgz == 0 & ITAMon2.GetAttacken[3].Mgz == 0)
{
    // This Line srG is a streamwriter despite the name
        srG = new StreamWriter(Zielordner.Text + "\\" + ITAListe.CheckedItems[0].ToString());
        EventLog.Text = ITAMon1.GetName + " Gewinnt!";
        ITAMon1.GetEXP += ITAMon1.GetGegner.GetLevel;
        if (ITAMon1.LvlUp())
        {
            Gewinner = ITAMon1;
            MessageBox.Show(ITAMon1.GetName + " hat das nächste Level erreicht!", "LevelUp", MessageBoxButtons.OK, MessageBoxIcon.Information);

            LevelUp levelUp = new LevelUp();
            levelUp.Show();
        }
        else
        {

            ITAMon1.Save(srG);
            this.Close();
            MessageBox.Show(ITAMon1.GetName + " Gewinnt!", "Gewinner", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
}

有人有任何解决办法的想法吗?即使我手动将sr.Close()手动写入文档本身,但仍然无法使用,它还是应该可用的,不胜感激。

c# streamreader streamwriter
2个回答
0
投票

经验法则,只要有实现IDisposableclass,就始终使用using statement。您可以通过阅读文档找到答案。实际上,在这种情况下,StreamReader Class

中有一个大的突出显示部分告诉您要这样做。

如果您这样处理,则可以大大减少此类问题。一个using语句自然会在退出作用域后Disposes,并且流将在Dispose]上调用close

StreamReader Class

重要

此类型实现IDisposable接口。完成后使用该类型,您应该直接将其处理掉间接地。要直接处理该类型,请调用其Dispose方法在try / catch块中。要间接处理它,请使用一种语言构造,例如using(在C#中)或Using(在Visual Basic中)。欲了解更多信息,请参阅“使用实现IDisposable的对象”[IDisposable接口主题]部分。

关于您的问题,您有2个StreamReaders

,您只是关闭其中之一。再次说明,如果您使用了using statement,就不会有错误

0
投票

在我看来,using语句绝对是最好的方法,但也请确保刷新和关闭。示例显示了XML Writer,但是原理是相同的。

© www.soinside.com 2019 - 2024. All rights reserved.