C#Windows Service使用FlatDocument保持文件锁定,这是MSDN中的一个示例“在Word文档中查找和替换文本”
作者:互联网
我有Windows服务,可将文件复制到文件夹并替换Word文档中的“文本”.对于文档中的替换,我使用以下代码:Find and Replace text in a Word document
问题是:在我将下一个文件复制到另一个文件夹(并填写Word文档)之前,文件一直处于使用状态.
我的搜索和替换代码如下所示:
using (var flatDocument = new FlatDocument(fullpath))
{
flatDocument.FindAndReplace("ValueA", "ValueB");
// Save document on Dispose.
}
如果我跳过此代码,则服务运行正常,并且复制后未使用文件.即使在using子句之后,它如何仍然保持使用状态?
也许有人有线索?
解决方法:
我认为开发人员中心示例代码Find and Replace text in a Word document中可能存在错误.
简而言之,通过不对FlatDocument类中的底层FileStream调用Dispose来保持文件句柄打开.正如您认为Package.Dispose会清理此句柄一样,这似乎很奇怪,但事实并非如此.
如果您修改FlatDocument类中的代码(如我在以下内容中所做的那样),它应该修复它
在构造函数中
private Stream _stream; // Add this
public FlatDocument(Stream stream)
{
if (stream == null)
{
throw new ArgumentNullException("stream");
}
_stream = stream; // Add this
documents = XDocumentCollection.Open(stream);
ranges = new List<FlatTextRange>();
CreateFlatTextRanges();
}
处置中
public void Dispose()
{
documents.Dispose();
_stream.Dispose(); // Add this
}
标签:windows-services,openxml,c 来源: https://codeday.me/bug/20191025/1927451.html