我有一些带有.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中运行相同的代码,只要使用块超出预期范围,新文档就会立即解锁。
答案 0 :(得分:3)
找到了解决方法:
File.Copy(templateFilePath, documentFilePath, true);
using (WordprocessingDocument document = WordprocessingDocument.Open(documentFilePath, true))
{
document.ChangeDocumentType(WordprocessingDocumentType.Document);
而不是使用离开锁的Clone和SaveAs,如果我复制模板,修改它并保存而不是SaveAs,则不会保持锁定。
谢谢!
答案 1 :(得分:0)
SaveAs()
实际上与Clone()
相同(请参阅Documentation)。因此,它不仅会创建文件,还会打开包,因此要解除锁定,您应该Close()
。
document.SaveAs(@"C:\TempDoc\Template.docx").Close();