【问题标题】:how do I zip multiple files using GZipStream in c#如何在 C# 中使用 GZipStream 压缩多个文件
【发布时间】:2014-08-25 15:27:30
【问题描述】:

我使用数据表创建了多个 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&lt;filestream&gt; 我有所有 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 文件)

【问题讨论】:

  • 您发布的代码与您的问题完全无关。调用 List 文件流不是一个好主意。您没有文件,您的方法 GenerateCSVfiles 没有!很难弄清楚如何帮助你......
  • @TonyHopkinson 更新了我的完整代码,请检查
  • 你提到了ActionResult。你能确认你正在使用 MVC 吗?如果是这样,您应该将其添加到标签中。您希望在 ActionResult 方法中返回什么。您希望用户下载 zip 文件吗?
  • GZipStream 不支持创建包含多个压缩文件的存档。您需要一个支持 .gz 或 .zip 档案的库。周围有很多,最后也通过 ZipFile 类添加到 .NET 4.5 中。

标签: c# asp.net-mvc csv gzip filestream


【解决方案1】:

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

【讨论】:

    【解决方案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;
        }
    

    【讨论】:

    • 根据 DotNetZip 的评论,它有一些非常糟糕的错误。由于这些评论,我个人不敢使用它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多