2012-04-04 92 views
1

請分享您的想法!我有問題要檢查的文件夾,並轉換一組具有不同的擴展名的文件的PDF文件如何以編程方式確定Word應用程序凍結

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

} 

    } 
} 

代碼工作,問題是,當我打開一個文檔,或任何允許的一些推廣各項工作的權利,但我們說有人改變了擴展名的例子DoSomething.exe DoSomething.doc或在文件夾c:\路徑是損壞的文檔Word停止響應,當我嘗試打開此文件手動出現模式窗口文件轉換。在這種情況下該怎麼做

回答

1

我有類似的情況 - 一個解決方案是創建一個有2個線程的子進程,一個與Word交互,另一個是「看門狗」...「看門狗」線程會重複檢查某個模式窗口是否出現以及是否有預先定義的超時時間......在任何這些情況下,它會殺死進程一詞,然後等待另一個線程結束 - 如果另一個線程沒有在預先定義的時間內結束,則會殺死另一個線程螺紋...

這個工作好,但我在殺字艱難地導致一些如意的副作用,從沒有被清理,一些字設置臨時文件越來越看不上相同的情況下,觀察...

我最終使用第三方庫進行此轉換,並不需要安裝Word ..我對解決方案非常滿意,它執行得更好,遇到有問題的文檔時,我得到一個我可以處理的異常因此...我使用該庫是一個商用......如果這是一個選項,你我可以提供一個鏈接...

+0

謝謝您的回答我也想過這個辦法解決 我只是想確保沒有其他選擇 – HaikMnatsakanyan 2012-04-05 09:36:02

1

不幸的是,據我所知,Office對象模型沒有提供檢測或從Office應用程序凍結中恢復的任何方法。你甚至不需要破壞文件; Word-to-PDF轉換有時會凍結其他有效的文檔。

我發現的唯一解決方案是產生另一個進程(不僅僅是線程),它在單個文檔上執行轉換,讓主進程等待它在有限的時間內完成(比如5分鐘)。如果超時過期,那麼您的主進程應該終止轉換過程並將文檔標記爲不可處理。

您可能創作被髮射作爲轉換過程是作爲要通過命令行參數接收到Word文檔的完整路徑一個.NET控制檯應用程序的程序。

相關問題