MemoryStream - 将Zip文件添加到流中

时间:2014-07-01 13:24:24

标签: c# memorystream

我有一些处理一个或多个DataTable的代码,将行和列数据作为CSV文件写入流。每个DataTable的内容都保存到一个单独的CSV文件中,最后保存到zip文件中(使用DotNetZip。当只有一个DataTable需要处理时,此代码可以正常工作,但是当有多个DataTable时,行和列数据仅保存到一个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 个答案:

答案 0 :(得分:1)

我看到两个可能存在的问题:

1)outputStream.Position = 0;

2)var csv = new CsvWriter(streamWriter, config);

首先不是reset the stream的正确方法。第二个可能有一些问题与rewinded流;

1)要纠正第一个:

ms.Seek(0, IO.SeekOrigin.Begin)
ms.SetLength(0)

或者只是为每个表创建新的MemoryStream。

2)要纠正第二个,只需为每个表创建新的CsvWriter。

foreach (DataTable dt in dataTables)
{
    var csv = new CsvWriter(streamWriter, config);
    ...
}

我建议你处理这两个问题,因为重复使用旧对象没有任何巨大的优势(或者你有没有对你的代码进行分析?),但是如果错误的处理,可能会导致各种不一致的行为。 misresetting。