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

本文关键字:文件 可处理 ZipArchive IO Compression System | 更新日期: 2023-09-27 18:34:40

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

我在压缩 1gb(大约(文件时遇到问题。

我尝试实现此代码,但仍然收到错误"System.OutOfMemoryException"

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

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

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;
}

我缺少什么,请给我建议,可能是教程或最佳实践处理此问题。

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

我知道

这是一个旧帖子,但我能说什么,它帮助我整理了一些东西,并且仍然是谷歌的热门歌曲。

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

您必须确保关闭 32-首选。拥有这个设置(在我的情况下是"AnyCPU"的构建(会导致很多不一致的问题。

话虽如此,我获取了一些演示文件(几个小于 500MB,一个为 500MB,一个为 1GB(,并创建了一个带有 3 个按钮的示例程序,这些按钮使用了 3 种方法。

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 损坏了更多的文件!

搞砸了,我的意思是在我的文件中,500MB 和 1GB 文件最终出现在压缩存档中,但大小小于原始文件(基本上被截断了(。

所以我不知道...由于周围不再有很多 32 位操作系统,我想这可能是一个有争议的问题。

但似乎System.IO.Compression Framework中有一些错误!