MemoryStream -添加Zip文件到流
本文关键字:文件 Zip 添加 MemoryStream | 更新日期: 2023-09-27 18:11:10
我有一些处理一个或多个数据表的代码,将行和列数据作为CSV文件写入流。每个DataTable的内容保存到一个单独的CSV文件,最后保存到zip文件(使用DotNetZip)。当只有一个数据表需要处理时,这段代码工作得很好,但是当有多个数据表时,行和列数据只被保存到一个CSV(其他CSV是空的),并且数据在随机位置被截断。
MemoryStream stream = new MemoryStream();
MemoryStream outputStream = new MemoryStream();
StreamWriter streamWriter = new StreamWriter(stream);
StreamWriter outStreamWriter = new StreamWriter(stream);
CsvConfiguration config = new CsvConfiguration();
config.QuoteAllFields = true;
streamWriter.WriteLine("sep=" + config.Delimiter);
var zip = new ZipFile();
var csv = new CsvWriter(streamWriter, config);
foreach (DataTable dt in dataTables)
{
foreach (DataColumn dc in dt.Columns)
{
csv.WriteField(dc.ColumnName.ToString());
}
csv.NextRecord();
foreach (DataRow dr in dt.Rows)
{
foreach (DataColumn dc in dt.Columns)
{
csv.WriteField(dr[dc].ToString());
}
csv.NextRecord();
}
zip.AddEntry(report.Title.ToString() + dt.GetHashCode() + ".csv", stream);
stream.Position = 0;
}
zip.Save(outputStream);
streamWriter.Flush();
outStreamWriter.Flush();
outputStream.Position = 0;
return outputStream;
我怀疑我使用的zip.AddEntry()可能不是将文件保存到流的正确方法。一如既往地感谢任何帮助。还要注意,我知道我的代码中没有任何using语句:我太懒了,没有在这个示例中添加它。
我发现有两个地方可能存在问题:
1) outputStream.Position = 0;
和
2) var csv = new CsvWriter(streamWriter, config);
First不是重置流的正确方法。第二,倒带流可能有一些问题;
1)纠正第一个:
ms.Seek(0, IO.SeekOrigin.Begin)
ms.SetLength(0)
或者直接为每个表创建新的MemoryStream
2)纠正第二个只需为每个表创建新的CsvWriter。
foreach (DataTable dt in dataTables)
{
var csv = new CsvWriter(streamWriter, config);
...
}
我建议您处理这两个问题,因为重用旧对象没有任何巨大的优势(或者您对代码进行了概要分析吗?),但是在错误处理和错误重置的情况下,它可能导致各种不一致的行为。