在写入XML文件时读取它

时间:2016-11-09 17:17:48

标签: c# .net xml read-write file-access

我有一个长期运行的REST API方法,用于编译XML文件。用户发出启动此编译的请求,创建基本文件,然后为用户提供用于查询进度的唯一ID。

调用时,进度读取方法打开具有只读访问权限的文件,实例化XDocument对象并计算其中元素的数量。

使用

访问填充 XML文件的代码
using (var fs = new FileStream(filePath, FileMode.Open, FileAccess.ReadWrite, FileShare.Read))
{
    var xmlDoc = XDocument.Load(fs);

    foreach (...)
    {
        // add the element to xmlDoc

        xmlDoc.Save(filePath);
    }
}

读取文件的代码以计算元素数量

using (var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
    var xmlDoc = XDocument.Load(fs);

    // count elements
}

但是,在填充方法中,xmlDoc.Save(filePath);上会抛出异常

  

该进程无法访问文件“...”,因为它正由另一个进程使用。

据我了解,使用FileShare.Read打开FileStream允许另一个进程以只读访问权限打开文件(我相信这种情况正在发生),同样在阅读/计数中使用FileShare.ReadWrite方法将允许填充过程使用write-access打开文件。

为什么上面的代码不允许两个进程都按照我的期望进行操作?

1 个答案:

答案 0 :(得分:2)

致电时

xmlDoc.Save(filePath)

您传递了文件名,因此XmlDocument不会使用您开通的fs信息流。相反,它会在内部打开另一个流,这当然会失败,因为您已经打开了一个流写入。

相反,寻找流的开头,然后调用

xmlDoc.Save(fs);

您可以在保存之前将流长度设置为零(截断旧内容),但不完全确定是否必要。

相关问题