2012-04-19 1 views
0

こんにちは私は、コードのために単語ファイルから平文を開いて取得する方法を知っています。しかし、私はこのことから悪影響を受けています。 docという言葉はロックされ、私はそれをロックしているものをどのように割り振るかを認識していません。私が最終的に望むのは、UNCパスに含まれるファイルを開いて、他の人が開いているかどうかにかかわらず、その行を解析し、閉じ、何も保存したり、ファイルをロックしたりしないファイルです。私が得ることができる最も近いファイルを開くことができます、それを解析する、それはロックされますが、私はそれを開いて(コードを実行している同じマシン)それを魔法のロックを解除します。単語の文書を開き、ロックせずに参照することはできません。

私はCOM上でほとんど何も知らないので、私はしばらく捜して、マーシャルオブジェクトについて何かを見つけ出し、それを加えました。私はリファレンス 'ReadOnly:True'、 'ReadOnly:False'をオン/オフしようとしました。私は何かシンプルな私は行方不明だと思うので、私はここで尋ねると思った。任意の提案は自由です、私は.NET 4.0でコーディングしているので、Docを開くために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); 

} 

答えて

0

何らかの理由でロックが維持されていると考えました。私は、Garbage Collectorを実行するだけでなく、Do not Save Changesを使って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; 
関連する問題