如何在 C# 中使用 Ionic-zip 下载大文件时修复 zip 文件损坏错误

Posted

技术标签:

【中文标题】如何在 C# 中使用 Ionic-zip 下载大文件时修复 zip 文件损坏错误【英文标题】:How to fix zip file corrupt error while downloading large files with Ionic-zip in c# 【发布时间】:2020-03-01 20:37:52 【问题描述】:

在 c# 中使用 Ionic.zip 下载大文件时出现错误文件损坏错误。当用户提取该文件时,将显示损坏的文件。当我用更少的文件做同样的事情时,它工作正常。即使它在创建 zip 文件时也没有给出任何错误。我正在创建现有 pdf 文件的 zip 文件,这些文件添加到一个 zip 文件中。可能有 5 个文件,也可能有 1000 个文件,每个文件至少 10 MB。

我已尝试使用谷歌提供的阈值和所有其他选项,但没有找到任何解决方案。

using (ZipFile zip = new ZipFile())

    zip.AlternateEncodingUsage = ZipOption.AsNecessary;
    zip.CompressionLevel = Ionic.Zlib.CompressionLevel.Level9;
    //zip.AddDirectoryByName("Files");

    for (int i = 0; i < dt.Rows.Count; i++)
    
        filePath = Convert.ToString(dt.Rows[i]["filePath"]);
        fileIds.Add(Convert.ToInt32(dt.Rows[i]["fileid"]));
        string fileFullName = Convert.ToString(dt.Rows[i]["fileName"]);
        string fName = Convert.ToString(dt.Rows[i]["fileName"]).Split('_')[1];

        //ExceptionLogging c1 = new ExceptionLogging("filePath = " + filePath + " fileFullName = " + fileFullName +
        //    " fName = " + fName);
        //c1.ErrorLog(HttpContext.Current.ApplicationInstance.Server.MapPath("~/Logs/"));


        if (!fileNamesList.Contains(fileFullName.Split('_')[0]))
        
            //ExceptionLogging c2 = new ExceptionLogging("In if condition -- filePath = " + filePath);
            //c2.ErrorLog(HttpContext.Current.ApplicationInstance.Server.MapPath("~/Logs/"));

            zip.AddFile(filePath, "Files");
            fileNamesList.Add(fileFullName.Split('_')[0]);
        
        else
        
            filePath = filePath.Substring(0, filePath.Length - 4) + "_" + fName;
            //filePath = filePath.Split('.')[0] + "_" + fName;
            zip.AddFile(filePath, "Files");
            fileNamesList.Add(fileFullName);

            //ExceptionLogging c3 = new ExceptionLogging("In else condition -- filePath = " + filePath + " fileFullName = " + fileFullName);
            //c3.ErrorLog(HttpContext.Current.ApplicationInstance.Server.MapPath("~/Logs/"));
        
        //zip.AddFile(filePath, "Files");
    

    Response.Clear();
    Response.BufferOutput = false;
    string zipName = String.Format("ZipFile-0.zip", DateTime.Now.ToString("yyyy-MMM-dd-HHmmss"));
    Response.ContentType = "application/zip";
    Response.AddHeader("content-disposition", "attachment; filename=" + zipName);
    zip.Save(Response.OutputStream);
    //Response.End();
    HttpContext.Current.ApplicationInstance.CompleteRequest();

我应该能够下载 zip 中的大文件。

【问题讨论】:

【参考方案1】:

我的解释需要比评论更多的空间:

在 x32 平台上,.Net 的可用内存限制是让程序压缩更大尺寸的文件。尝试暂时切换到 x64,这可能会解决您的问题。

我还建议对 LOH(大对象堆)进行研究,知道它会在您将来处理此类场景时派上用场:

An article about LOH

【讨论】:

以上是关于如何在 C# 中使用 Ionic-zip 下载大文件时修复 zip 文件损坏错误的主要内容,如果未能解决你的问题,请参考以下文章

阿里巴巴组织调整,大文娱站稳1号位

阿里否认蒋凡调任阿里大文娱集团;蘑菇街回应裁员 14%;Android Studio 3.6.3 稳定版发布| 极客头条

如何在 C# 中下载 zip 文件?

如何在 C# 中下载 HTML 源代码

阿里星球阉割音乐服务 阿里巴巴大文娱总算有点靠谱了

2w字的超级大文:自动化测试入门