1

我需要编写一些带有样式(如颜色、字体)的文本,所以我决定使用 html。我发现这HtmlTextWriter是一个用于编写 html 文件的类。但是,我发现我必须手动关闭或刷新它,否则不会将任何内容写入文件。为什么?(使用语句应该在块完成时处理它)

        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 报告它。看起来CloseDispose行为不同,这没有记录并且非常不寻常。我在 MSDN 上也找不到任何文档说明HtmlTextWriter 是否拥有底层文本编写器的所有权;即它会处理底层的文本编写者还是必须处理?

编辑 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{} finally {} 块,因为这将为您处理对象。

于 2011-07-06T11:52:46.593 回答
0

我怀疑原因是 HtmlTextWriter 没有为 TextWriter 的protected virtual void Dispose( bool disposing )调用方法提供覆盖,Close()所以你是对的,你需要自己做这个 - TextWriter 的实现是空的。正如方面指出的那样,您不需要语句中的try finally块。using正如 Eamon Nerbonne 所指出的,这肯定是一个框架错误。

于 2011-07-06T11:59:41.280 回答