Путь по-прежнему невозможно использовать после использования потокового чтения, даже если потоковый чтения был закрыт - PullRequest
0 голосов
/ 14 февраля 2020

ОБНОВЛЕНИЕ: я сохранил путь в строке и отправил его в другой документ,

Я сделал небольшую игру для школы, и все работает, как задумано, но когда «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 и a 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)
            {


                Pfad = 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(Pfad);
                    srG.Close();
                    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)
        {
                Pfad = 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
                {
                    srG = new StreamWriter(Pfad);
                    ITAMon1.Save(Pfad);
                    srG.Close();
                    this.Close();
                    MessageBox.Show(ITAMon1.GetName + " Gewinnt!", "Gewinner", MessageBoxButtons.OK, MessageBoxIcon.Information);
                }

У кого-нибудь есть идеи, как это исправить? Его можно использовать даже после того, как я вручную вписал sr.Close() в сам документ, и он все равно не будет работать, любая помощь будет оценена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...