【问题标题】:How to close a XML FileStream如何关闭 XML FileStream
【发布时间】:2015-10-18 11:12:25
【问题描述】:

我正在使用下面的代码来读取 .xml 文件并将数据传输到 4 个复选框。但是我得到了错误

“进程无法访问该文件: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);
        }
    }

【问题讨论】:

  • 我看不出你的代码有什么明显的问题,所以可能是其他进程打开了文件?根据您对环境的了解,您是否知道任何可能的进程候选者可能会打开它?
  • 您应该将文件流包装在using statement 中。见using Statement (C# Reference)。可能由于引发了异常,该文件保持打开状态。
  • 我同意@1800INFORMATION。但我建议尽快关闭流……在反序列化之后。
  • @dbc 就像下面显示的那个人一样?
  • 是的。 确定您的问题不是由缺少using 语句引起的。但是,它可能是,并且您应该始终将一次性用品包装在 using 语句中,以确保它们在发生异常时被处置。

标签: c# .net xml memory-leaks dispose


【解决方案1】:

让用户 Dispose 你的 Disposable 对象以释放引用/内存,并关闭底层流。

 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);
        }     
    }
}

编辑

如果上面没有修复错误,可能是 Text Changed 事件(data1_TextChanged) 触发得太频繁了。在 TextBox LostFocus 上或使用按钮单击事件尝试此功能。

【讨论】:

  • "进程无法访问该文件:CXXXX 因为它正被另一个进程使用"
  • @GabrielDeFreitas:你确定你做了我上面的修改吗?
  • 100% 确定,不知道发生了什么
  • 可能文本更改事件 (data1_TextChanged) 触发太频繁。通过单击按钮尝试此功能。
  • 我正要评论它,只是删除了代码,错误就消失了。有没有另一种不需要为此放置按钮的方法?
猜你喜欢
  • 1970-01-01
  • 2018-09-07
  • 2010-12-20
  • 2014-06-12
  • 1970-01-01
  • 1970-01-01
  • 2022-10-02
  • 1970-01-01
  • 2012-04-08
相关资源
最近更新 更多