IIS使用OpenXML创建的Word文件在处理后继续被IIS锁定

本文关键字:IIS 处理 继续 锁定 文件 使用 OpenXML 创建 Word | 更新日期: 2023-09-27 18:02:43

我有一些扩展名为。docm的单词模板,其中包含标记化的标识符,这些标识符将被数据库中的实际值所替换。

我正在加载模板,克隆它并将文档类型从模板更改为文档,然后将其作为新文档保存到磁盘:

string templateFilePath = @"C:'TempDoc'Template.docm";
using (WordprocessingDocument template = WordprocessingDocument.CreateFromTemplate(templateFilePath))
{
    using (WordprocessingDocument document = (WordprocessingDocument)template.Clone())
    {
        document.ChangeDocumentType(WordprocessingDocumentType.Document);
        document.SaveAs(@"C:'TempDoc'Template.docx");
    }   
}

所有这些都可以工作,但是新创建的文件仍然被W3WP进程锁定,然后无法读取并从服务流回。

你知道如何防止IIS持有这个文件吗?

同样的代码可以在LinqPad中运行,一旦using块超出预期的范围,新文档就会立即解锁。

IIS使用OpenXML创建的Word文件在处理后继续被IIS锁定

找到解决方法:

        File.Copy(templateFilePath, documentFilePath, true);
        using (WordprocessingDocument document = WordprocessingDocument.Open(documentFilePath, true))
        {
            document.ChangeDocumentType(WordprocessingDocumentType.Document);

不使用Clone和savea,这会离开锁,如果我文件复制模板,修改模板并保存,而不是savea,则不会维护锁。

谢谢!

SaveAs()实际上与Clone()相同(参见文档)。所以它不只是创建一个文件,而且还打开包,所以要解除锁,你应该Close()它。

document.SaveAs(@"C:'TempDoc'Template.docx").Close();