【问题标题】:MemoryStream - Adding Zip File to StreamMemoryStream - 将 Zip 文件添加到流中
【发布时间】:2014-07-01 13:24:23
【问题描述】:

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

【问题讨论】:

    标签: c# memorystream


    【解决方案1】:

    我看到有两个可能的问题地方:

    1)outputStream.Position = 0;

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

    首先不是reset the stream 的正确方法。其次,倒带流可能有一些问题;

    1)纠正第一个:

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

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

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

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

    我建议你同时处理这两个问题,因为重用旧对象并没有什么巨大的优势(或者你有没有分析过你的代码?),但如果错误处理和处理,可能会导致各种不一致的行为错误重置。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-04
      • 2011-09-07
      • 2013-05-27
      • 1970-01-01
      相关资源
      最近更新 更多