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