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

5
我正尝试使用C#/.NET和Microsoft.Office.Interop.Word打开一个非常旧的(二进制)Word文件。无论我尝试使用下面的代码片段打开此文件,它都会失败并出现一个COM异常,告诉我:“您正在尝试打开受信任中心中的文件阻止设置所阻止的文件类型。”
在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;
}

只是一个想法,如果您以管理员身份运行控制台应用程序,您会得到这个吗? - JMK
谢谢你的建议,但不幸的是它没有起作用。 - bjelleklang
1
这是“网页标记”。请参见:http://blogs.msdn.com/b/ieinternals/archive/2011/03/23/understanding-local-machine-zone-lockdown-restricted-this-webpage-from-running-scripts-or-activex-controls.aspx。 这比那更复杂。可以通过使用“PersistentZoneIdentifier”类来进行Interop更改。 (我之所以知道这一点,是因为雷蒙德·陈昨天写了一篇完整的文章。)http://blogs.msdn.com/b/oldnewthing/archive/2013/11/04/10463035.aspx - Ben
1个回答

7
这是通过NTFS文件系统支持的备用数据流实现的。您可以使用文件名:流语法访问此类流。存储有关文件阻止功能信息的流名称为Zone.Identifier:$DATA。通常是由复制文件的程序(通常是浏览器)编写的。
您可以使用DIR /R选项查看它们。SysInternals的Streams实用程序允许列出和删除它们。摆脱它的一种愚蠢方法是将其复制到不支持备用数据流的文件系统中,例如.zip存档或闪存驱动器,然后将其复制回来。
您可以使用命令notepad filename:zone.identifier查看流的内容或编辑它,您将看到以下内容:
[ZoneTransfer]
ZoneId=3

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


2
这比那更加复杂。可以通过Interop进行更改,使用PersistentZoneIdentifier coclass。(我之所以知道这一点,是因为Raymond Chen昨天刚刚写了一篇完整的文章。)http://blogs.msdn.com/b/oldnewthing/archive/2013/11/04/10463035.aspx - Ben

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接