为什么我要打电话归档.WriteLine()无法将StringBuilder的所有内容写入该文件

本文关键字:文件 StringBuilder 打电话 我要 WriteLine 为什么 | 更新日期: 2023-09-27 17:57:50

我正试图通过StringBuilder和file.WriteLn()将一个html文件写入磁盘,但该文件只写了几行,因此毫无用处。我的代码是:

    private void BuildAndWriteHTMLFile()
{
    StringBuilder sb = new StringBuilder();
    sb.Append("<!DOCTYPE html>");
    sb.Append("<html lang='"en'">");
    sb.Append("<head>");
    sb.Append("<meta charset='"utf-8'">");
    sb.Append("<title>Green Bay Packers 2013 Schedule (All times Central)</title>");
    sb.Append("<script src='"http://ajax.googleapis.com/ajax/libs/jquery/1.10.1/jquery.min.js'"></script> ");
    sb.Append("<script src='"http://maps.google.com/maps/api/js?sensor=false'"></script> ");
    sb.Append("<script src='"gomap.js'"></script> ");
    sb.Append("<!--[if IE]>");
    sb.Append("<script src='"http://html5shiv.googlecode.com/svn/trunk/html5.js'"></script>");
    sb.Append("<![endif]-->");
. . . // oodles on noodly code elided for lack of reason to leave it in
    sb.Append("this.singleMarker = false;");
    sb.Append("this.lockGeocode = false;");
    sb.Append("this.markers = [];");
    sb.Append("this.tmpMarkers = [];");
    sb.Append("this.geoMarkers = [];");
    sb.Append("},");
    sb.Append("isVisible: function(latlng) {");
    sb.Append("return this.map.getBounds().contains(latlng);");
    sb.Append("}");
    sb.Append("}");
    sb.Append("})(jQuery);");
    sb.Append("$(function() {");
    sb.Append("$('"#map'").goMap({ ");
    sb.Append("latitude: 36.75,  ");
    sb.Append("longitude: -100, ");
    sb.Append("maptype: 'ROADMAP',");
    sb.Append("zoom: 5");
    sb.Append("}); ");
    sb.Append("$.goMap.createMarker({");
    sb.Append("address: 'Green Bay, Wisconsin',");
    sb.Append("title: 'Lambeau Field, Green Bay, WI',");
    sb.Append("html: '<h1>Green Bay Packers Home Games</h1><p class='"away'">Game 1, Week 1) Sunday Sept. 8 at SAN FRANCISCO 49ERS  3:25 p.m.</p><p>Game 2, Week 2) Sunday Sept. 15 WASHINGTON REDSKINS Noon</p><p class='"away'">Game 3, Week 3) Sunday Sept. 22 at CINCINNATI BENGALS Noon</p><p>Game 4, Week 5) Sunday Oct. 6    DETROIT LIONS       Noon</p><p class='"away'">Game 5, Week 6) Sunday Oct. 13 at BALTIMORE RAVENS        Noon</p><p>Game 6, Week 7) Sunday Oct. 20   CLEVELAND BROWNS    3:25 p.m.</p><p class='"away'">Game 7, Week 8) Sunday Oct. 27 at MINNESOTA VIKINGS  7:30 p.m.</p><p>Game 8, Week 9) Monday Nov. 4   CHICAGO BEARS       7:40 p.m.</p><p>Game 9, Week 10) Sunday Nov. 10 PHILADELPHIA EAGLES     Noon</p><p class='"away'">Game 10, Week 11) Sunday Nov. 17 at NEW YORK GIANTS   7:30 p.m. (flex)</p><p>Game 11, Week 12) Sunday Nov. 24 MINNESOTA VIKINGS   Noon (flex)</p><p class='"away'">Game 12, Week 13) Thursday Nov. 28 at DETROIT LIONS    11:30 a.m.  </p><p>Game 13, Week 14) Sunday Dec. 8  ATLANTA FALCONS     7:30 p.m. (flex)</p><p class='"away'">Game 14, Week 15) Sunday Dec. 15 at DALLAS COWBOYS    3:25 p.m. (flex)</p><p>Game 15, Week 16) Sunday Dec. 22 PITTSBURGH STEELERS 3:25 p.m. (flex)</p><p class='"away'">Game 16, Week 17) Sunday Dec. 29 at CHICAGO BEARS Noon (flex)</p><p class='"away'">SUPER BOWL Sunday Feb. 2, 2014 vs ?</p>'");
    //sb.Append("html: '<h1>Green Bay Packers Home Games</h1><p class='"away'">Game 1, Week 1) Sunday Sept. 8 at SAN FRANCISCO 49ERS    3:25 p.m.</p><p>Game 2, Week 2) Sunday Sept. 15 WASHINGTON REDSKINS Noon</p><p class='"away'">Game 3, Week 3) Sunday Sept. 22 at CINCINNATI BENGALS Noon</p><p>Game 4, Week 5) Sunday Oct. 6    DETROIT LIONS       Noon</p><p class='"away'">Game 5, Week 6) Sunday Oct. 13 at BALTIMORE RAVENS        Noon</p><p>Game 6, Week 7) Sunday Oct. 20   CLEVELAND BROWNS    3:25 p.m.</p><p class='"away'">Game 7, Week 8) Sunday Oct. 27 at MINNESOTA VIKINGS  7:30 p.m.</p><p>Game 8, Week 9)");
    //sb.Append("Monday Nov. 4  CHICAGO BEARS       7:40 p.m.</p><p>Game 9, Week 10) Sunday Nov. 10 PHILADELPHIA EAGLES     Noon</p><p class='"away'">Game 10, Week 11) Sunday Nov. 17 at NEW YORK GIANTS   7:30 p.m. (flex)</p><p>Game 11, Week 12) Sunday Nov. 24 MINNESOTA VIKINGS   Noon (flex)</p><p class='"away'">Game 12, Week 13) Thursday Nov. 28 at DETROIT LIONS    11:30 a.m.  </p><p>Game 13, Week 14) Sunday Dec. 8  ATLANTA FALCONS     7:30 p.m. (flex)</p><p class='"away'">Game 14, Week 15) Sunday Dec. 15 at DALLAS COWBOYS    3:25 p.m. (flex)</p><p>Game 15, Week 16)");
    //sb.Append("Sunday Dec. 22 PITTSBURGH STEELERS 3:25 p.m. (flex)</p><p class='"away'">Game 16, Week 17) Sunday Dec. 29 at CHICAGO BEARS Noon (flex)</p><p class='"away'">SUPER BOWL Sunday Feb. 2, 2014 vs ?</p>'");
    sb.Append("});");
    sb.Append("});");
    sb.Append("</script>");
    sb.Append("</body>");
    sb.Append("</html>");
    string nameOfFile = string.Format(@"C:'misc'mapcode_{0}", GetFileNameDateTimeExtension());
    if (!File.Exists(nameOfFile))
    {
        StreamWriter file = new StreamWriter(@nameOfFile);
        file.WriteLine(sb.ToString());
        urlOfGeneratedFile = string.Format("file:///{0}", nameOfFile);
        webBrowser1.Url = new Uri(urlOfGeneratedFile);
    }
}

问题是,所编写的文件是StringBuilder中内容的截断版本。它首先截断了附加的最后几行(写入的文件以"NEW YORK G"结尾);当我在结束脚本、body和html标记之前注释掉最后一个createMarker部分时,该文件的结尾略高于"this.lockGeocode=false;this.markers=[];this.tmpMarkers=[];this.geoM"

这就好像在所有行都写入StringBuilder之前就已经完成了对文件的写入。

我需要调用Flush、Sleep方法还是什么?

为什么我要打电话归档.WriteLine()无法将StringBuilder的所有内容写入该文件

您没有关闭/处置StreamWriter,写入程序有一个内部缓冲区,在关闭流之前不会写入。将写入程序包装在using语句中,以在完成后自动关闭文件。

if (!File.Exists(nameOfFile))
{
    using(StreamWriter file = new StreamWriter(@nameOfFile))
    {
        file.WriteLine(sb.ToString());
    }
    urlOfGeneratedFile = string.Format("file:///{0}", nameOfFile);
    webBrowser1.Url = new Uri(urlOfGeneratedFile);
}

然而,您的代码可以简化为不使用StreamWriter,而只调用File.WriteAllText

if (!File.Exists(nameOfFile))
{
    File.WriteAllText(@nameOfFile,sb.ToString());
    urlOfGeneratedFile = string.Format("file:///{0}", nameOfFile);
    webBrowser1.Url = new Uri(urlOfGeneratedFile);
}

UPDATE:实际上,与File.WriteAllText会有细微的差异,file.WriteLine会在文本末尾添加一个额外的换行符,而File.WriteAllText不会。如果换行符在那里对您来说很重要,请在调用File.WriteAllText之前添加一个sp.AppendLine();

如果您对StreamWriter使用using块,这应该可以正常工作。

using(StreamWriter file = new StreamWriter(@nameOfFile)) 
  file.WriteLine(sb.ToString());
urlOfGeneratedFile = string.Format("file:///{0}", nameOfFile);
webBrowser1.Url = new Uri(urlOfGeneratedFile);

否则,是,请使用StreamWriter.Flush或将StreamWriter.AutoFlush设置为true。