2011-07-06 6 views
1

私はhtmlを使うことにしたので、スタイル(色、フォントなど)でテキストを書く必要があります。私はHtmlTextWriterがhtmlファイルを書くのに使用されるクラスであることを発見しました。しかし、ファイルを手動で閉じるかフラッシュしないと、ファイルに何も書き込まれていないことがわかりました。それはなぜです? (ブロックの終了時にステートメントを使用して処分する必要があります)HtmlTextWriterは処分時にフラッシュされませんか?

 using (HtmlTextWriter htmlWriter = new HtmlTextWriter(new StreamWriter(
      Path.Combine(EmotionWordCounts.FileLocations.InputDirectory.FullName, fileName), 
      false, Encoding.UTF8))) 
     { 
      try 
      { 

       htmlWriter.WriteFullBeginTag("html"); 
       htmlWriter.WriteLine(); 
       htmlWriter.Indent++; 

       htmlWriter.WriteFullBeginTag("body"); 
       htmlWriter.WriteLine(); 
       htmlWriter.Indent++; 

       // write something using WriteFullBeginTag and WriteEndTag 
       // ... 

      } //try 
      finally 
      { 
       htmlWriter.Indent--; 
       htmlWriter.WriteEndTag("body"); 
       htmlWriter.WriteLine(); 

       htmlWriter.Indent--; 
       htmlWriter.WriteEndTag("html"); 
       htmlWriter.Close(); // without this, the writer doesn't flush 
      } 
     } //using htmlwriter 

ありがとうございます。

答えて

2

これはHtmlTextWriterのバグです。自己完結型のテストケースとreport it using Microsoft Connectを作成する必要があります。 CloseDisposeの動作が異なるようですが、これは文書化されておらず、非常に珍しいことです。私はまた、HtmlTextWriter takes ownership of the underlying textwriterかどうかを示すMSDNの文書を見つけることができません。すなわち、それは下にあるテキストライターを処分するか、それともあなたが必要ですか?

編集2:HtmlTextWriter上のMSDNのページでは、それが仮想Dispose(bool)方法(上書きではなく)を継承することを述べています。これは、現在の実装が明らかにできないことを意味しますは、ブロックを使用してクリーンアップできません。回避策として、これを試してみてください。

using(var writer = ...make TextWriter...) 
using(var htmlWriter = new HtmlTextWriter(writer)) { 

    //use htmlWriter here... 

} //this should flush the underlying writer AND the HtmlTextWriter 

// although there's currently no need to dispose HtmlTextWriter since 
// that doesn't do anything; it's possibly better to do so anyhow in 
// case the implementation gets fixed 

ちなみに、new StreamWriter(XYZ, false, Encoding.UTF8)new StreamWriter(XYZ)と同等です。 StreamWriterはデフォルトで追加するのではなく作成し、デフォルトではBOMのないUTF8を使用します。

幸運にも、report the bugを忘れないでください!私は理由は、指定されたHtmlTextWriterがそうClose()を呼び出すためにしたTextWriterのprotected virtual void Dispose(bool disposing)メソッドのオーバーライドを提供しないということである疑いがある

+0

ありがとうございました。それは多くの助けになります。私はちょうどそれを使用する方法についていくつかの基本的なアイデアを得た。私は前にhtmlを書いていませんでした。しかし、私は報告事に精通していない。このバグを報告してください。 (それは機能ですか?) – LLS

0

usingステートメントの中にtry {} Finally {}ブロックを置く必要はありません。これはオブジェクトを破棄するためです。

+0

ご意見ありがとうございます。私はHTML文書のためにそれが必要でないかもしれないと思う。 – LLS

0

は、あなたは正しい、あなたはこの自分を行う必要があります - したTextWriterの実装は空です。アスペクトが指摘したように、あなたはusingステートメントの中でtry finallyブロックを必要としません。 Eamon Nerbonneが指摘しているように、これは確かにフレームワークのバグです。

+0

ありがとうございました。私はXMLTextWriterプログラムからいくつかのコードをコピーしました。私はいつもWriteEndDocumentを使用することをお勧めします。しかし、私はここで大きな問題ではないと信じています。 – LLS

関連する問題