每个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();
}
}
}
}
}
}
答案 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();
并再次运行后,将显示缺失的行。