DotNetZip为什么最后一行总是被截断

时间:2014-01-21 19:22:05

标签: dotnetzip

每个zip文件都有一个截断的最后一行。我输出控制台的行并且它没有被截断,为什么压缩文件的最后一行会被截断?

using (SqlConnection conn = new SqlConnection(ConfigurationManager.AppSettings["connstring"]))
        {
          conn.Open();
          using (SqlCommand cmd = new SqlCommand())
          {
            cmd.Connection = conn;
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.CommandText = "final_out";
            cmd.Parameters.Add("@jobid", SqlDbType.VarChar).Value = jobid;
            cmd.Parameters.Add("@filename", SqlDbType.VarChar).Value = filename;
            using (SqlDataReader rdr = cmd.ExecuteReader())
            {
              using (MemoryStream ms = new MemoryStream())
              {
                using (StreamWriter sw = new StreamWriter(ms))
                {
                  while (rdr.Read())
                  {
                    string nextval = rdr[0].ToString();
                    sw.WriteLine(nextval);
                    Console.WriteLine(nextval);
                  }
                  ms.Flush();
                  ms.Position = 0;
                  using (ZipFile zf = new ZipFile(Path.Combine(Path.GetDirectoryName(finalPath), Path.GetFileNameWithoutExtension(finalPath) + ".zip")))
                  {
                    zf.AddEntry(Path.GetFileName(finalPath), ms);
                    zf.Save();
                  }
                }
              }
            }
          }
        }

1 个答案:

答案 0 :(得分:3)

因为你没有刷新StreamWriter

你正在刷新MemoryStream,这是一个无操作。

StreamWriter类在内部保留一个缓冲区,你没有刷新,所以最后几行和/或字符仍将位于此缓冲区中。如果单击该链接并查看文档,您可以看到构造函数文档中的内容如下:

  

使用UTF-8编码和默认缓冲区大小为指定的流初始化StreamWriter类的新实例。

(我的重点)


替换它:

ms.Flush();

用这个:

sw.Flush();

这是一个简单的LINQPad程序,演示了:

void Main()
{
    using (var ms = new MemoryStream())
    using (var sw = new StreamWriter(ms, Encoding.UTF8))
    {
        for (int index = 1; index <= 200; index++)
            sw.WriteLine("Line #" + index);

        ms.Flush();
        ms.Position = 0;

        Encoding.UTF8.GetString(ms.ToArray()).Dump();
    }
}

输出:

Line #1
Line #2
...
Line #196

(缺少第197行到第200行。)

ms.Flush();替换为sw.Flush();并再次运行后,将显示缺失的行。