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

C# 如何在c中使用GZipStream压缩多个文件#,c#,asp.net-mvc,csv,gzip,filestream,C#,Asp.net Mvc,Csv,Gzip,Filestream,我使用datatable创建了多个csv文件,并希望将所有这些文件压缩到一个zip文件中。 这就是我现在正在做的 我尝试了以下代码 List<string> filestream = GenerateCSVfiles(dataSets); //Generate CSV files public List<string> GenerateCSVfiles(List<DataSet> dataSets) { List<string> file

我使用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;
}
//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();
}
public byte[]CompressStringToFile(字符串文件名,列表文件流)
{   
MemoryStream f2=新的MemoryStream();
FileStream fs=newfilestream();
GZipStream gz=新的GZipStream(f2,CompressionMode.Compress,false);
foreach(文件流中的字符串ost)
{
字节[]b=GetBytes(oStr);
写入(b,0,b.长度);
}
返回f2.ToArray();
}
请更正我以生成.zip文件。(包含内部2.csv文件)


您需要安装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;
    }
public ActionResult下载文件()
{
string string1=“value1,value2,value3,value4”;
string string2=“value10、value20、value30、value40”;
列表文件=新列表();
添加(string1);
文件。添加(string2);
byte[]buffer=CompressStringToFile(“myfile.zip”,files);
返回文件(缓冲区,“应用程序/zip”);
}
私有字节[]压缩字符串文件(字符串文件名,列表内容)
{
字节[]结果=空;
整数计数=0;
使用(var ms=new MemoryStream())
{
使用(var s=新ZipoutStream(ms))
{
foreach(内容中的字符串str)
{
s、 PutNextEntry(String.Format(“条目{0}.txt”,count++”);
byte[]buffer=Encoding.UTF8.GetBytes(str);
s、 写入(缓冲区,0,缓冲区长度);
}
}
结果=ToArray女士();
}
返回结果;
}

您不能使用
GZipStream
执行此操作。您需要一个第三方库。可能是最好的了。我在过去的项目中使用过它,它非常容易使用。另外,它已经存在了一段时间,所以应该非常稳定并且没有bug。

您发布的代码与您的问题完全无关。调用列表文件流不是一个好主意。你没有文件,你的方法GenerateCSVfiles没有!很难想出如何帮助你…@TonyHopkinson更新了我的完整代码请检查你提到的
ActionResult
。你能确认你正在使用MVC吗?如果是这样,您应该将其添加到标记中。在ActionResult方法中,您希望返回什么。是否希望用户下载zip文件?GZipStream不支持创建包含多个压缩文件的存档。您需要一个支持.gz或.zip存档的库。有很多,最后添加到.NET4.5以及ZipFile类中。根据DotNetZip的评论,它有一些非常糟糕的bug。就我个人而言,由于这些评论,我不敢使用它。
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;
    }