我如何在c#中使用GZipStream压缩多个文件

本文关键字:压缩 GZipStream 文件 | 更新日期: 2023-09-27 18:11:21

我使用datatable创建了多个csv文件,并希望将所有这些文件压缩到一个zip文件中。也就是我在动态地做所有的事情

I tried following code

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");

//压缩文件生成代码

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文件)

我如何在c#中使用GZipStream压缩多个文件

您不能使用GZipStream。你需要一个第三方库。SharpZipLib可能是最好的。我在过去的项目中使用过它,它非常容易使用。再加上它已经存在了一段时间,所以应该相当稳定和无bug。

您需要安装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;
    }