1

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

        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

前もって感謝します。

4

3 に答える 3

2

これは のバグですHtmlTextWriter。自己完結型のテスト ケースを作成し、Microsoft Connect を使用して報告する必要があります。Closeと の動作が異なるようですがDispose、これは文書化されておらず、非常に珍しいことです。HtmlTextWriter が基になるテキストライターの所有権を取得するかどうかを示す MSDN のドキュメントも見つかりません。つまり、基礎となるテキストライターを破棄しますか、それとも破棄する必要がありますか?

編集 2: の MSDN ページにHtmlTextWriterは、(オーバーライドではなく) 仮想Dispose(bool)メソッドを継承すると記載されています。これは、現在の実装がusing ブロックで明らかにクリーンアップできないことを意味します。回避策として、これを試してください:

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 も使用します。

頑張ってください -バグを報告することを忘れないでください!

于 2011-07-06T11:58:14.210 に答える
0

usingステートメント内にtry{}Final {}ブロックを含める必要はありません。これにより、オブジェクトが破棄されます。

于 2011-07-06T11:52:46.593 に答える
0

protected virtual void Dispose( bool disposing )その理由は、HtmlTextWriter が TextWriter のメソッドを呼び出すためのオーバーライドを提供していないためだと思われClose()ます。そうです、自分でこれを行う必要があります - TextWriter の実装は空です。アスペクトが指摘したように、ステートメントtry finally内にブロックは必要ありません。usingEamon Nerbonne が指摘したように、これは確かにフレームワークのバグです。

于 2011-07-06T11:59:41.280 に答える