无法打开单词doc并在不锁定的情况下引用它

时间:2012-04-19 23:16:09

标签: c#-4.0 com

您好我知道如何打开并从word文件中获取纯文本以获取一些代码。但是我发生了这种不良影响。单词doc被锁定,我不知道如何分配任何锁定它的东西。我最终想要打开一个将在UNC路径中读取其中一部分的文件,无论其他人是否打开它,从中解析行,关闭它,不保存任何内容或锁定文件。我能得到的最接近的是我可以打开一个文件,解析它,它会锁定,但是当我打开它并关闭它时(运行代码的同一台机器)它会神奇地解锁它。

我对COM几乎一无所知,所以我找了一会儿,找到了关于马歇尔物体的东西,并补充说。我试图打开和关闭引用'ReadOnly:True','ReadOnly:False'。我觉得我有一些简单的东西,所以我想我会问这里。任何建议都是免费的,我在.NET 4.0中进行编码,所以你没有传递所有烦人的obj = null,obj = null来打开Doc。

 public static string ReadWordDoc(string loc)
{
Word.Application wordApp = new Word.Application();

Word.Document Doc = wordApp.Documents.Open(loc, ReadOnly: true);

sb = "";

foreach (Word.Paragraph objParagraph in Doc.Paragraphs)
{
try 
{
    sb += objParagraph.Range.Text + "\n";
}
catch (Exception ex)
{
    throw ex;
}
}

return sb;

Doc.Close(SaveChanges: false);

Marshal.ReleaseComObject(Doc);

wordApp.Quit(SaveChanges: false);

}

1 个答案:

答案 0 :(得分:0)

我出于某种原因想出了锁定。我确保使用“不保存更改”退出Word应用程序以及运行垃圾收集器。它可能有点矫枉过正,但它基本上确保我的目标文件上没有任何锁定。

Word._Application wordApp = new Word.Application();
    Word._Document Doc = wordApp.Documents.Open(loc, ReadOnly: true);
        try
        {
            sb = "";

            foreach (Word.Paragraph objParagraph in Doc.Paragraphs)
            {
                try
                {
                    sb += objParagraph.Range.Text + "\n";
                }
                catch (Exception ex)
                {
                    throw ex;
                }
            }
        }
        catch (COMException) { }
        finally
        {
            //FileInfo finfo = new FileInfo(loc);
            //finfo.IsReadOnly = false;

            if (Doc != null)
            {
                Doc.Close();
                Doc = null;
            }
            if (wordApp != null)
            {
                wordApp.Quit(Word.WdSaveOptions.wdDoNotSaveChanges);
                wordApp = null;
            }
        }

        GC.Collect();
        GC.WaitForPendingFinalizers();

        GC.Collect();
        GC.WaitForPendingFinalizers();

        return sb;