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语句:我太懒了,没有在这个示例中添加它。

MemoryStream -添加Zip文件到流

我发现有两个地方可能存在问题:

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);
    ...
}

我建议您处理这两个问题,因为重用旧对象没有任何巨大的优势(或者您对代码进行了概要分析吗?),但是在错误处理和错误重置的情况下,它可能导致各种不一致的行为。