我使用datatable创建了多个csv文件,并希望将所有这些文件压缩成一个zip文件。 这是我在动态做的全部。
我尝试了以下代码
List<string> filestream = GenerateCSVfiles(dataSets);
//Generate CSV files
public List<string> GenerateCSVfiles(List<DataSet> dataSets)
{
List<string> filestream = new List<string>();
StringBuilder result = null;
foreach (DataSet dataSet in dataSets)
{
result = new StringBuilder();
System.Data.DataTable dataTable = dataSet.Tables[0];
foreach (DataColumn colm in dataTable.Columns)
{
result.Append(colm.ColumnName+",");
}
result.Append("\n");
//create csv file
foreach (DataRow row in dataTable.Rows)
{
for (int i = 0; i < dataTable.Columns.Count; i++)
{
result.Append(row[i].ToString());
result.Append(i == dataTable.Columns.Count - 1 ? "\n" : ",");
}
}
filestream.Add(result.ToString());
}
return filestream;
}
现在在List<filestream>
我有2个文件数据要创建2个不同的.csv
文件并动态创建一个temp.gz
文件我该怎么办?
在ActionResult
方法上,我尝试按照代码生成.zip文件,但它已损坏
return File(CompressStringToFile("temp.gz", filestream), System.Net.Mime.MediaTypeNames.Application.Zip, "temp.gz");
// zip文件生成代码
public byte[] CompressStringToFile(string fileName, List<string> filestream)
{
MemoryStream f2 = new MemoryStream();
FileStream fs = new FileStream();
GZipStream gz = new GZipStream(f2, CompressionMode.Compress, false);
foreach (string oStr in filestream)
{
byte[] b = GetBytes(oStr);
gz.Write(b, 0, b.Length);
}
return f2.ToArray();
}
纠正我生成.zip文件。 (内有2个.csv文件)
答案 0 :(得分:2)
您需要安装NuGet软件包 DotNetZip 。
这对你有用:
public ActionResult DownloadFile()
{
string string1 = "value1, value2, value3, value4";
string string2 = "value10, value20, value30, value40";
List<String> files = new List<String>();
files.Add(string1);
files.Add(string2);
byte[] buffer = CompressStringToFile("myfile.zip", files);
return File(buffer, "application/zip");
}
private byte[] CompressStringToFile(string fileName, List<string> content)
{
byte[] result = null;
int count = 0;
using (var ms = new MemoryStream())
{
using (var s = new ZipOutputStream(ms))
{
foreach (string str in content)
{
s.PutNextEntry(String.Format("entry{0}.txt", count++));
byte[] buffer = Encoding.UTF8.GetBytes(str);
s.Write(buffer, 0, buffer.Length);
}
}
result = ms.ToArray();
}
return result;
}
答案 1 :(得分:1)
您无法使用GZipStream
执行此操作。你需要一个第三方库。可能最好的那个是SharpZipLib。我过去在项目上使用过这个,而且它很容易使用。此外它已经存在了一段时间,所以应该非常稳定且没有错误。