簡體   English   中英

MemoryStream-將Zip文件添加到流

[英]MemoryStream - Adding Zip File to Stream

我有一些代碼可以處理一個或多個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) outputStream.Position = 0;

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

首先,不是重置流的正確方法。 第二,倒帶的流可能會有一些問題;

1)要糾正第一個:

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

或者只是為每個表創建新的MemoryStream。

2)要糾正第二個問題,只需為每個表創建新的CsvWriter。

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

我建議您處理這兩個問題,因為重用舊對象並沒有任何巨大的優勢(或者您是否對代碼進行了概要分析?),但是如果處置不當和重置不當,可能會導致各種不一致的行為。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM