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

bje*_*ang 5 .net c# com com-interop visual-studio-2010

我正在尝试使用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;
}
Run Code Online (Sandbox Code Playgroud)

Han*_*ant 7

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

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

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

[ZoneTransfer]
ZoneId=3
Run Code Online (Sandbox Code Playgroud)

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

  • 它比这更复杂.可以使用`PersistentZoneIdentifier` coclass通过interop进行更改.(我只知道这一点,因为Raymond Chen昨天才对此进行了全面的写作.)http://blogs.msdn.com/b/oldnewthing/archive/2013/11/04/10463035.aspx (2认同)