读取正在写入的XML文件

本文关键字:XML 文件 读取 | 更新日期: 2023-09-27 18:17:04

我有一个长时间运行的REST API方法,它编译XML文件。用户发出请求来启动这个编译,基本文件被创建,然后用户得到一个唯一的ID,用它来查询进度。

调用时,progress-reading方法以只读访问打开文件,实例化一个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将允许填充进程以写访问打开文件。

为什么上面的代码不允许两个进程做我所期望的?

读取正在写入的XML文件

当你调用

xmlDoc.Save(filePath)

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

应该查找到流的开头,然后调用

xmlDoc.Save(fs);

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