[英]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.