0

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

我对 COM 几乎一无所知,所以我搜索了一段时间,发现了有关 Marshall 对象的一些信息并添加了它。我试图打开和关闭参考“只读:真”,“只读:假”。我觉得我缺少一些简单的东西,所以我想我会在这里问。任何建议都是免费的,我在 .NET 4.0 中进行编码,所以你没有传递所有那些烦人的 obj = null, obj = null 来打开文档。

 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);

}
4

1 回答 1

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;
于 2012-04-26T23:02:34.500 回答