如何以编程方式确定Word应用程序冻结

时间:2012-04-04 18:09:17

标签: c# ms-word pdf-generation office-interop docx

请分享您的想法!我有问题检查文件夹并在PDF中转换一组具有不同扩展名的文档

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using Microsoft.Office.Interop.Word;
namespace ConsoleApplication7
{
    class Program
    {
        static void Main(string[] args)
        {

            Microsoft.Office.Interop.Word.Application word = new Microsoft.Office.Interop.Word.Application();
            object oMissing = System.Reflection.Missing.Value;
            word.Visible = false;
            word.ScreenUpdating = false;


            object aa = WdOpenFormat.wdOpenFormatAuto;
            string errorMessage = null;


            word.DisplayAlerts = WdAlertLevel.wdAlertsNone;

            //selection extension 

            var allExtentionGroupFiles = Directory.GetFiles(@"C:\path", "*.*").
                Where(s=>!s.Contains("~$") && (s.EndsWith(".docx") 
                || s.EndsWith(".doc")
                || s.EndsWith(".docm")
                || s.EndsWith(".dotx")
                || s.EndsWith(".dotm")
                || s.EndsWith(".dot")
                || s.EndsWith(".mht")
                || s.EndsWith(".mhtml")
                || s.EndsWith(".rtf")
                || s.EndsWith(".txt")
                || s.EndsWith(".xml")
                || s.EndsWith(".odt")
                || s.EndsWith(".wps"))).
                GroupBy(s=>s.Substring(s.LastIndexOf('.'))).OrderBy(s=>s.Key);

            foreach (var currentExtentionGroup in allExtentionGroupFiles)
            {

                Console.WriteLine("-->>{0}", currentExtentionGroup.Key);
                foreach (var currentDoc in currentExtentionGroup)
                {

                    Object filename = (Object)currentDoc;



                    try
                    {
                        //open current document

                        Document document = word.Documents.Open(filename,ConfirmConversions:aa,OpenAndRepair:true,Revert:true);

                        document.Activate();


                        object outputFileName = currentDoc.Replace(currentExtentionGroup.Key, ".pdf").Insert(10, "TEST");
                        object fileFormat = WdSaveFormat.wdFormatPDF;


                        document.SaveAs(ref outputFileName,
                        ref fileFormat, ref oMissing, ref oMissing,
                        ref oMissing, ref oMissing, ref oMissing, ref oMissing,
                        ref oMissing, ref oMissing, ref oMissing, ref oMissing,
                        ref oMissing, ref oMissing, ref oMissing, ref oMissing);



                        document.Close();

                    }
                    catch (Exception e1)
                    {
                        errorMessage = e1.ToString();

                    }
                }
            }

word.Quit();

}

    }
}

代码正在运行,问题是当我打开一个文档或任何允许的扩展都工作正常时,但是让我们说某人更改了文件夹c:\ path上或文件夹中的示例DoSomething.exe DoSomething.doc的扩展名是损坏的文档Word停止响应,当我尝试手动打开此文件时出现模式窗口文件转换。在这种情况下该怎么做

2 个答案:

答案 0 :(得分:1)

不幸的是,据我所知,Office对象模型没有提供任何检测或恢复冻结Office应用程序的方法。你甚至不需要破坏文件;对于其他有效的文档,Word-to-PDF转换有时会冻结。

我找到的唯一解决方案是生成另一个进程(不仅仅是线程),它在单个文档上执行转换,让主进程等待它在有限的时间内完成(例如,5分钟) 。如果超时,则主进程应终止转换过程并将文档标记为不可处理。

您可以将程序作为转换过程创作为.NET控制台应用程序,该应用程序通过命令行参数接收Word文档的完整路径。

答案 1 :(得分:1)

我有类似的情况 - 一个解决方案是创建一个包含2个线程的子进程,一个与Word交互,另一个是“看门狗”...“看门狗”线程将反复检查是否出现了一些模态窗口是否预先定义的超时是...在任何这些情况下它会杀死单词进程,然后等待另一个线程结束 - 如果另一个线程没有在预定义的时间内结束它将杀死另一个线程......

这工作正常但是我在相同的情况下观察到,难以杀死单词导致一些不愉快的副作用,从临时文件未被清理到某些单词设置被破坏......

我最终使用第三方库进行此转换,根本不需要安装Word ..我对解决方案非常满意,它表现得更好,如果有问题的文档,我会得到一个异常,我可以相应地处理...我正在使用的图书馆是商业图书馆...如果这是一个选项,我可以提供链接......