我有数据集读取xml文件,然后再次写入相同的xml。这个读取和写入xml文件的过程将定期命中(10秒后)。我面临的错误是文件正在处理后,从数据集写入一次后,它会显示一个错误,表示
该进程无法访问该文件 'D:\ DayUsers \ Official \ Projects \ BlocksXml \ 712.xml'因为它正在存在 被另一个过程使用。
当我们下次通过其他请求查看相同的代码时,会产生错误。
我的代码在下面给出了相同的过程
Dataset ds = new DataSet();
string path = AppDomain.CurrentDomain.BaseDirectory + "\\BlocksXml\\" + _statusDeviceID + ".xml";
System.IO.FileStream fsReadXml = new System.IO.FileStream(path, System.IO.FileMode.Open);
ds.ReadXml(fsReadXml);
fsReadXml.Close();
// ds.ReadXml(AppDomain.CurrentDomain.BaseDirectory + "\\BlocksXml\\" + _statusDeviceID + ".xml");
if (_blockData.Length.ToString() == ds.Tables[0].Rows[0] ["ArrayLength"].ToString())
{
ds.Tables[0].Columns.Remove("ArrayLength");
varcount = ds.Tables["Status"].Columns.Count;
var nexcount = 0;
for (int i = 0; i < varcount; i++)
{
ds.Tables["Status"].Rows[0][i] = _blockData[i];
}
if (ds.Tables.Contains("tblDigitalInputRows"))
{
nexcount = ds.Tables["tblDigitalInputRows"].Rows.Count;
if (nexcount > 0)
{
nexcount = ds.Tables["tblDigitalInputRows"].Columns.Count;
}
varcount = varcount - 1;
for (int k = 0; k < ds.Tables["tblDigitalInputRows"].Rows.Count; k++)
{
for (int i = 0; i < nexcount - 1; i++)
{
ds.Tables["tblDigitalInputRows"].Rows[k][i] = _blockData[varcount];
varcount++;
}
}
}
if (ds.Tables.Contains("tblDigitalOutputRows"))
{
nexcount = ds.Tables["tblDigitalOutputRows"].Rows.Count;
if (nexcount > 0)
{
nexcount = ds.Tables["tblDigitalOutputRows"].Columns.Count;
}
for (int k = 0; k < ds.Tables["tblDigitalOutputRows"].Rows.Count; k++)
{
for (int i = 0; i < nexcount - 1; i++)
{
ds.Tables["tblDigitalOutputRows"].Rows[k][i] = _blockData[varcount];
varcount++;
}
}
}
if (ds.Tables.Contains("tblAnalogInputRows"))
{
nexcount = ds.Tables["tblAnalogInputRows"].Rows.Count;
if (nexcount > 0)
{
nexcount = ds.Tables["tblAnalogInputRows"].Columns.Count;
}
for (int k = 0; k < ds.Tables["tblAnalogInputRows"].Rows.Count; k++)
{
for (int i = 0; i < nexcount - 1; i++)
{
ds.Tables["tblAnalogInputRows"].Rows[k][i] = _blockData[varcount];
varcount++;
}
}
}
if (ds.Tables.Contains("tblEnumInputRows"))
{
nexcount = ds.Tables["tblEnumInputRows"].Rows.Count;
if (nexcount > 0)
{
nexcount = ds.Tables["tblEnumInputRows"].Columns.Count;
}
for (int k = 0; k < ds.Tables["tblEnumInputRows"].Rows.Count; k++)
{
for (int i = 0; i < nexcount - 1; i++)
{
ds.Tables["tblEnumInputRows"].Rows[k][i] = _blockData[varcount];
varcount++;
}
}
}
_blockDeviceID = Convert.ToInt32(_blockData[1]);
ds.Tables[0].Columns.Add("ArrayLength", typeof(string));
ds.Tables[0].Rows[0]["ArrayLength"] = _blockData.Length;
ds.WriteXml(AppDomain.CurrentDomain.BaseDirectory + "\\BlocksXml\\" + _blockData[1].ToString() + ".xml");
提前致谢。
答案 0 :(得分:2)
不是通过FileStream
阅读XML,而是直接在ds.ReadXml
ds.ReadXml(path);
使用DataSet.ReadXml Method (String)
重载,将文件路径作为参数。
我猜这个流没有及时关闭。
答案 1 :(得分:1)
我已经在文件流的帮助下解决了这个问题。以下是代码
using (FileStream stream = File.Open(path, FileMode.Open, FileAccess.ReadWrite, FileShare.None))
{
ds.ReadXml(stream);
_blockDeviceID = Convert.ToInt32(_blockData[1]);
ds.Tables[0].Columns.Add("ArrayLength", typeof(string));
ds.Tables[0].Rows[0]["ArrayLength"] = _blockData.Length + "";
// Reset the stream here to the beginning of the file!
ds.WriteXml(stream);
}