2015-07-28 5 views
1

Я использую этот код ниже, чтобы прочитать .xml-файл &, перевести данные на 4 флажка. Но им получить ошибкуКак закрыть XML FileStream

«Процесс не может получить доступ к файлу: CXXXX Поскольку его использования другого процесс»

Я думал, что это может быть потому, что чтение или запись, но закрыто и как вы можете видеть, код ниже. Есть идеи?

private void Form1_Load(object sender, EventArgs e) 
    { 
     if (File.Exists("data.xml")) 
     { 
      XmlSerializer xs = new XmlSerializer(typeof(Information)); 
      FileStream read = new FileStream("data.xml", FileMode.Open, FileAccess.Read, FileShare.Read); 
      Information info = (Information)xs.Deserialize(read); 

      data1.Text = info.Data1; 
      data2.Text = info.Data2; 
      data4.Text = info.Data3; 
      data4.Text = info.Data4; 

      read.Close(); 
     } 
    } 



// this class to write the data into xml file 
class SaveXML 
{ 
    public static void SaveData(object obj, string filename) 
    { 
     XmlSerializer sr = new XmlSerializer(obj.GetType()); 

     TextWriter writer = new StreamWriter(filename); 
     sr.Serialize(writer, obj); 
     writer.Close();   
    } 
} 


    // using this to update the .xml file with new data when textchanged 
    private void data1_TextChanged(object sender, EventArgs e) 
    { 
     try 
     { 
      Information info = new Information(); 
      info.Data1 = data1.Text; 
      SaveXML.SaveData(info, "data.xml");     
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
    } 
+1

Я не вижу ничего плохого в вашем коде, поэтому, возможно, в каком-то другом процессе файл открыт? Основываясь на своих знаниях о своей среде, знаете ли вы о возможных кандидатах на процессы, которые могут быть открыты? –

+1

Вы должны обернуть поток файлов в ['using' statement] (https://msdn.microsoft.com/en-us/library/system.io.filestream%28v=vs.110%29.aspx). См. [Using Statement (C# Reference)] (https://msdn.microsoft.com/en-us/library/yh598w02.aspx). Возможно, файл остался открытым, потому что было выбрано исключение. – dbc

+0

Я согласен с @ 1800INFORMATION. Но я бы предложил закрыть поток как можно скорее ... сразу после десериализации. –

ответ

2

Сделать пользователем Вы удаляете свои одноразовые объекты для освобождения ссылок/памяти, а также закрывает базовый поток.

private void Form1_Load(object sender, EventArgs e) 
    { 
     if (File.Exists("data.xml")) 
     { 
      using (FileStream read = new FileStream("data.xml", FileMode.Open, FileAccess.Read, FileShare.Read)) 
      { 
       XmlSerializer xs = new XmlSerializer(typeof(Information)) 
       Information info = (Information)xs.Deserialize(read); 

       data1.Text = info.Data1; 
       data2.Text = info.Data2; 
       data4.Text = info.Data3; 
       data4.Text = info.Data4; 
      } 
     } 
    } 


class SaveXML 
{ 
    public static void SaveData(object obj, string filename) 
    { 
     using(TextWriter writer = new StreamWriter(filename)) 
     { 
      XmlSerializer sr = new XmlSerializer(obj.GetType()); 

      sr.Serialize(writer, obj); 
     }  
    } 
} 

EDIT

Если выше не исправить ошибку, вероятно, изменить текст, событие (data1_TextChanged) срабатывает слишком часто. Попробуйте эту функцию в TextBox LostFocus или с помощью события нажатия кнопки.

+0

Получение такой же ошибки –

+0

@GabrielDeFreitas: Какая ошибка? – CharithJ

+0

«Процесс не может получить доступ к файлу: CXXXX Поскольку он используется другим процессом» –

Смежные вопросы