在写入文件时读取 XML 文件
Reading an XML file while it is being written to
我有一个 long-运行 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
}
但是,在 populating 方法中,xmlDoc.Save(filePath);
抛出异常
The process cannot access the file '...' because it is being used by another process.
据我了解,使用 FileShare.Read
打开 FileStream 允许另一个进程以只读访问权限打开文件(我相信这正在发生)并且同样在 FileShare.ReadWrite
中使用 reading/counting 方法将允许填充进程以写访问权限打开文件。
为什么上面的代码不允许两个进程都按照我的预期进行?
当你打电话给
xmlDoc.Save(filePath)
您传递了文件名,因此 XmlDocument
不会使用您打开的用于写入的 fs
流。相反,它会在内部打开另一个流,这当然会失败,因为您已经打开了一个流用于写入。
相反,查找流的开头然后调用
xmlDoc.Save(fs);
您也可以在保存前将流长度设置为零(以截断旧内容),但不完全确定是否有必要。
我有一个 long-运行 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
}
但是,在 populating 方法中,xmlDoc.Save(filePath);
The process cannot access the file '...' because it is being used by another process.
据我了解,使用 FileShare.Read
打开 FileStream 允许另一个进程以只读访问权限打开文件(我相信这正在发生)并且同样在 FileShare.ReadWrite
中使用 reading/counting 方法将允许填充进程以写访问权限打开文件。
为什么上面的代码不允许两个进程都按照我的预期进行?
当你打电话给
xmlDoc.Save(filePath)
您传递了文件名,因此 XmlDocument
不会使用您打开的用于写入的 fs
流。相反,它会在内部打开另一个流,这当然会失败,因为您已经打开了一个流用于写入。
相反,查找流的开头然后调用
xmlDoc.Save(fs);
您也可以在保存前将流长度设置为零(以截断旧内容),但不完全确定是否有必要。