我需要写一些带样式的文本(比如颜色,字体),所以我决定使用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
提前致谢。
答案 0 :(得分:2)
这是HtmlTextWriter
中的错误。您应该创建一个独立的测试用例report it using Microsoft Connect。似乎Close
和Dispose
表现不同,没有记录,并且非常不寻常。我也找不到MSDN上的任何文件,说明HtmlTextWriter takes ownership of the underlying textwriter是否;即它会处置基础文本编写者还是你必须?
编辑2: HtmlTextWriter
上的MSDN页面声明它继承(而不是覆盖)虚拟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创建而不是追加,默认情况下它也使用UTF8而不包含BOM。
答案 1 :(得分:0)
您不需要在using语句中使用try {} Finally {}块,因为这将为您处理该对象。
答案 2 :(得分:0)
我怀疑原因是HtmlTextWriter没有为TextWriter的protected virtual void Dispose( bool disposing )
方法提供覆盖来调用Close()
所以,你是对的,你需要自己做 - TextWriter的实现是空的。正如方面所指出的那样,您不需要try finally
语句中的using
块。正如Eamon Nerbonne指出的那样,这肯定是一个框架错误。