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

时间:2013-11-05 11:51:56

标签: c# .net visual-studio-2010 com com-interop

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

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

Word.Application app;

string file = "<filename>";

app = new Word.Application();

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

1 个答案:

答案 0 :(得分:7)

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

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

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

[ZoneTransfer]
ZoneId=3

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