首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >System.IO.Compression.ZipArchive处理大文件

System.IO.Compression.ZipArchive处理大文件
EN

Stack Overflow用户
提问于 2016-02-16 03:12:54
回答 1查看 2.7K关注 0票数 0

我有代码,这是用C#编写的压缩文件的SSIS脚本任务。

在压缩1gb文件时,我遇到了问题。

我尝试实现这段代码,但仍然得到错误“System.OutOfMemoryException”

System.OutOfMemoryException:抛出了“System.OutOfMemoryException”类型的异常。 在ST_4cb59661fb81431abcf503766697a1db.ScriptMain.AddFileToZipUsingStream(String sZipFile,c:\Users\dtmp857\AppData\Local\Temp\vsta\84bef43d323b439ba25df47c365b5a29\ScriptMain.cs:line 333中的String sFilePath,String sFileName,String sBackupFolder,String sPrefixFolder) 在ST_4cb59661fb81431abcf503766697a1db.ScriptMain.Main() in c:\Users\dtmp857\AppData\Local\Temp\vsta\84bef43d323b439ba25df47c365b5a29\ScriptMain.cs:line 131

这是压缩文件时的代码片段:

代码语言:javascript
复制
protected bool AddFileToZipUsingStream(string sZipFile, string sFilePath, string sFileName, string sBackupFolder, string sPrefixFolder)
{
    bool bIsSuccess = false;

    try
    {
        if (File.Exists(sZipFile))
        {
            using (ZipArchive addFile = ZipFile.Open(sZipFile, ZipArchiveMode.Update))
            {
                addFile.CreateEntryFromFile(sFilePath, sFileName);

                //Move File after zipping it
                BackupFile(sFilePath, sBackupFolder, sPrefixFolder);
            }
       }
       else
       {
       //from https://stackoverflow.com/questions/28360775/adding-large-files-to-io-compression-ziparchiveentry-throws-outofmemoryexception
           using (var zipFile = ZipFile.Open(sZipFile, ZipArchiveMode.Update))
           {
               var zipEntry = zipFile.CreateEntry(sFileName);

               using (var writer = new BinaryWriter(zipEntry.Open()))
               using (FileStream fs = File.Open(sFilePath, FileMode.Open))
               {
                   var buffer = new byte[16 * 1024];

                   using (var data = new BinaryReader(fs))
                   {
                        int read;

                        while ((read = data.Read(buffer, 0, buffer.Length)) > 0)
                            writer.Write(buffer, 0, read);
                   }
               }
          }

          //Move File after zipping it
          BackupFile(sFilePath, sBackupFolder, sPrefixFolder);
      }

      bIsSuccess = true;
  }

  catch (Exception ex)
  {
     throw ex;
  }

  return bIsSuccess;
}

我缺少的东西,请给我建议,也许指导或最佳实践处理这个问题。

EN

回答 1

Stack Overflow用户

发布于 2021-05-20 16:47:06

我知道这是一篇老文章,但我该怎么说呢,它帮助我整理了一些东西,但仍然是谷歌的热门话题。

所以System.IO.Compression库肯定有问题!首先也是最重要的..。

您必须确保关闭32首选的。拥有这个集合(在我的例子中,构建为"AnyCPU")会导致许多不一致的问题。

现在,我使用了一些演示文件(几个小于500 of,一个小于500 of,一个在1GB),并创建了一个使用这3种方法的3个按钮的示例程序。

代码语言:javascript
复制
Button 1 - ZipArchive.CreateFromDirectory(AbsolutePath, TargetFile);
Button 2 - ZipArchive.CreateEntryFromFile(AbsolutePath, RelativePath);
Button 3 - Using the [16 * 1024] Byte Buffer method from above

现在这是它变得有趣的地方。(假设程序构建为"AnyCPU“,没有32种首选检查).所有3种方法都可以在Windows 64位操作系统上工作,不管它有多少内存。

然而,当我在32位操作系统上运行相同的测试时,不管它有多少内存,只有方法1有效!

方法2和方法3由于外部内存错误而崩溃,并向其添加盐分,方法3(首选的分块方法)实际上比方法2损坏的文件更多!

我的意思是,在我的文件中,500 my和1GB文件最终被压缩到压缩存档中,但大小小于原始文件(基本上是截断的)。

所以我不知道。因为现在的32位操作系统已经不多了,我想这可能是个未知数。

但是似乎在System.IO.Compression框架中有一些But!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35423005

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档