使用C#打开Word文档(.doc)会因文件阻止设置而导致COMException

我正在尝试使用C#/ .NET和Microsoft.Office.Interop.Word打开一个非常旧的(二进制)Word文件。 每当我尝试使用下面的代码段打开此文件时,它都会因为COMException而失败,告诉我“您正在尝试打开信任中心中的文件阻止设置阻止的文件类型。”

这也常见于在MS Word中打开相同文件时发生,但在调整信任中心中找到的设置后,现在可以正常工作。 但是,我仍然无法使用C#打开文件。 有谁知道VS2010是否缓存这些设置,或者在某处使用自己的设置? 我还尝试使用相同的代码片段创建一个新项目(在修复Word中的设置之后)以查看是否有帮助,但事实并非如此。

Word.Application app; string file = ""; app = new Word.Application(); try { app.Documents.Open(file); } catch (COMException e) { string s = e.Message; } 

这是通过NTFS文件系统支持的备用数据流实现的。 您使用filename:stream语法访问此类filename:stream 。 存储文件阻止function的信息的流名称是Zone.Identifier:$DATA 。 它是由复制文件的任何程序编写的,通常是浏览器。

您可以使用DIR / R选项查看它们。 SysInternals的Streams实用程序允许列出和删除它们。 摆脱它的一种愚蠢方法是将其复制到不支持备用数据流的文件系统,如.zip存档或闪存驱动器并将其复制回来。

您可以查看流的内容或使用notepad filename:zone.identifier等命令对其进行编辑,您将看到:

 [ZoneTransfer] ZoneId=3 

ZoneId值标识文件的来源。 值为-1 =未指定,0 =本地计算机,1 =内联网,2 =可信,3 =互联网,4 =不可信。 但是,在.NET中,记事本无法做到这一点,它明确禁止在文件名中使用:字符。 目的是让人类处理这个问题,明确地覆盖文件阻止function。 在资源管理器,属性中右键单击该文件,然后单击“取消阻止”按钮。 删除流。 请注意第一个链接中提到的Powershell cmdlet。