0

こんにちは、少しのコードで Word ファイルを開いてプレーン テキストを取得する方法を知っています。しかし、私はこれから悪影響を及ぼしています。doc という単語がロックされ、ロックされているものの割り当てを解除する方法がわかりません。私が最終的に望むのは、UNCパスにあるファイルを開いて、他の誰かが開いているかどうかに関係なく、その一部を読み取り、そこから行を解析し、閉じ、何も保存しないか、ファイルをロックすることです。私が得ることができる最も近いのは、ファイルを開いて解析し、ロックすることですが、開いて閉じると(コードを実行している同じマシン)、魔法のようにロックが解除されます。

私は COM についてほとんど何も知らないので、しばらく探して Marshall オブジェクトについて何かを見つけ、それを追加しました。参照「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);

}
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 に答える