【发布时间】:2018-03-27 10:49:32
【问题描述】:
我正在创建一个创建、写入和保存 xml 文件的程序。当我尝试打开保存的文件时,我收到一条错误消息,指出无法访问该文件,因为它正在被另一个进程使用。我认为这是因为我在保存文件后没有关闭文件流,所以我进行了更正。我仍然无法打开文件,并且收到相同的错误。我不确定超出这一点的问题是什么。我该如何解决这个问题?
namespace XML_DataSets
{
public partial class FormAddNew : Form
{
XmlSerializer xs;
List<Class1> ls;
//create the DataTable
DataTable dt = new DataTable("Contact");
XDocument xd = new XDocument();
public FormAddNew()
{
InitializeComponent();
ls = new List<Class1>();
xs = new XmlSerializer(typeof(List<Class1>));
//create columns for the DataTable
DataColumn dc1 = new DataColumn("Id");
dc1.DataType = System.Type.GetType("System.Int32");
dc1.AutoIncrement = true;
dc1.AutoIncrementSeed = 1;
dc1.AutoIncrementStep = 1;
//add columns to the DataTable
dt.Columns.Add(dc1);
dt.Columns.Add(new DataColumn("Name"));
dt.Columns.Add(new DataColumn("Age"));
dt.Columns.Add(new DataColumn("Gender"));
//create DataSet
DataSet ds = new DataSet();
ds.DataSetName = "AddressBook";
ds.Tables.Add(dt);
}
private void buttonCreate_Click(object sender, EventArgs e)
{
DataRow row = dt.NewRow();
row["Name"] = textBoxName.Text;
row["Age"] = textBoxAge.Text;
row["Gender"] = textBoxGender.Text;
dt.Rows.Add(row);
dataGridView1.DataSource = dt;
//dt.WriteXml("Contacts.xml");
xd = WriteDt2Xml(dt);
}
public static XDocument WriteDt2Xml(DataTable dt)
{
using (var stream = new MemoryStream())
{
dt.WriteXml(stream);
stream.Position = 0;
XmlReaderSettings settings = new XmlReaderSettings();
settings.ConformanceLevel = ConformanceLevel.Fragment;
XmlReader reader = XmlReader.Create(stream, settings);
reader.MoveToContent();
if (reader.IsEmptyElement) { reader.Read(); return null; }
return XDocument.Load(reader);
}
}
private void openToolStripMenuItem_Click(object sender, EventArgs e)
{
Stream input = null;
OpenFileDialog dialog = new OpenFileDialog();
openFileDialog.Filter = "xml file | *.xml";
openFileDialog.FilterIndex = 2;
openFileDialog.RestoreDirectory = true;
if (openFileDialog.ShowDialog() == DialogResult.OK)
{
try
{
if ((input = openFileDialog.OpenFile()) != null)
{
FileStream fs = new FileStream(@openFileDialog.FileName.ToString(), FileMode.Open, FileAccess.ReadWrite, FileShare.ReadWrite);
ls = (List<Class1>)xs.Deserialize(fs);
dataGridView1.DataSource = ls;
fs.Close();
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "ERROR");
}
}
}
}
}
@Daniel Advise 做得好...我重构了代码并看到了您提到的错误。我查看了您作为示例提供的两个链接。我进行了更正,但仍然得到相同的结果。
【问题讨论】:
-
快速猜测:
XmlReader reader永远不会被处理掉。 -
除了@mayu 的建议之外,如果您重新启动计算机然后除了清理、重建并运行它什么也不做,您是否会收到错误?
-
@Missy...是的,这是正确的。我目前正在研究连载,看看我哪里出错了。
-
@mayu - XmlReader 阅读器被包装在 Using...中,因此一旦 Using 完成,任何与它相关的进程都应该被处理掉。
-
@Daniel ...感谢您的所有帮助...此解决方案有效。我使用数据集、表和网格的原因是因为我一遍又一遍地构建相同的解决方案,以便我可以牢牢掌握 xml。感谢您的帮助和时间。干杯!
标签: c# xml filestream openfiledialog savefiledialog