C# Windows Service 使用 FlatDocument 保持文件锁定 MSDN "Find and Replace text in a Word document"



我有一个Windows服务可以将文件复制到文件夹中并替换Word文档中的文本。对于文档中的替换,我使用此代码:在Word文档中查找和替换文本

问题是:文件一直使用,直到我将下一个文件复制到另一个文件夹(并填写Word文档(。

我的搜索和替换代码如下所示:

using (var flatDocument = new FlatDocument(fullpath))
{
    flatDocument.FindAndReplace("ValueA", "ValueB");
    // Save document on Dispose.
}

如果我跳过此代码,则服务运行良好,复制后文件未使用。为什么即使在使用条款之后它仍然在使用?也许有人有线索?

我认为开发人员中心示例代码中可能存在错误 查找和替换 Word 文档中的文本。

简而言之,它通过不调用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
  }

最新更新