使用数据集读取相同的 xml 文件

本文关键字:xml 文件 数据集 读取 | 更新日期: 2023-09-27 18:30:45

我有数据集读取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");

提前谢谢。

使用数据集读取相同的 xml 文件

不是通过FileStream读取 XML,而是直接在 ds.ReadXml 中指定路径

ds.ReadXml(path);

使用DataSet.ReadXml Method (String)重载,它将文件路径作为参数。

这只是我的猜测,溪流没有及时关闭。

我已经在

文件流的帮助下解决了这个问题。下面是代码

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