ОБНОВЛЕНИЕ: я сохранил путь в строке и отправил его в другой документ,
Я сделал небольшую игру для школы, и все работает, как задумано, но когда «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()
в сам документ, и он все равно не будет работать, любая помощь будет оценена.