【问题标题】:Decompressing password-protected ZIP files with .NET 4.5使用 .NET 4.5 解压缩受密码保护的 ZIP 文件
【发布时间】:2012-10-31 14:42:19
【问题描述】:

Microsoft 在System.IO.Compression 命名空间中对 .NET 4.5 中的 ZIP 文件处理进行了改进。即ZipArchiveZipFile 类。 但是,我还没有看到使用本地 .NET ZIP 文件处理密码保护文件的方法。有没有办法做到这一点? (我知道有相当不错的 3rd 方 zip 文件库,这不是问题。)

【问题讨论】:

  • 您看过 DotNetZip 库吗?这是一个链接,它有很多例子dotnetzip.codeplex.com/…
  • 很好的问题,非常适合您的需求!

标签: c# .net zip .net-4.5


【解决方案1】:

很遗憾没有。 .Net Framework 4.5 不支持受密码保护的 zip 文件。在这种情况下,您必须切换到知名的 3rd 方库之一。

【讨论】:

    【解决方案2】:

    正如所指出的,DotNetZip 是您的朋友。解压缩 zip 文件就像

    using ( ZipFile archive = new ZipFile( @"c:\path\to\your\password\protected\archive.zip",) )
    {
      archive.Password = "your-pass-word-here" ;
      archive.Encryption = EncryptionAlgorithm.PkzipWeak ; // the default: you might need to select the proper value here
      archive.StatusMessageTextWriter = Console.Out;
    
      archive.ExtractAll( @"c:\path\to\unzip\directory\", ExtractExistingFileAction.Throw ) ;
    }
    

    根据我的经验,DotNetZip 的运行速度与 Info-Zip's 开源的 unzip 实用程序差不多,并且使用的内存量大致相同。


    编辑注释: DotNetZip 曾经住在 Codeplex。 Codeplex 已关闭。旧档案仍然是available at Codeplex。看起来代码已经迁移到Github了:


    【讨论】:

    【解决方案3】:

    离子方法很棒。我尝试了其他三种方法,这是迄今为止最好的。不要浪费时间,好好利用吧。

    https://dotnetzip.codeplex.com/wikipage?title=PS-Examples

    支持密码加密和其他 zip 选项。

    【讨论】:

      【解决方案4】:

      在查看 4.5 框架提供的methods 时,没有一种方法允许使用 zip 文件输入密码。正如您在问题中提到的,第 3 方将是您最好的选择。

      【讨论】:

        【解决方案5】:

        本机 .net 4.5 库中似乎不支持受密码保护的 zip 文件,类似于 Windows 资源管理器中似乎不支持的情况,即使是 Windows 10 也是如此! 有些人报告说他们在使用 3rd 方 DotNetLib 时遇到了 zip 损坏问题,因此请确保您广泛测试您是否确实走这条路,或者改用 SharpZipLib

        【讨论】:

          【解决方案6】:

          对于那些以 .Net Standard 2.0 为目标的用户,SharpZipLib 做得很好,可以将内存中受密码保护的 zip 文件优雅地提取到字节 []。

          https://github.com/icsharpcode/SharpZipLib

          在相同的场景下尝试过 Ionic,但可以使用 ZipInputStream 提取文件,这会生成损坏的提取字节数组。

          【讨论】:

            【解决方案7】:

            我发现用c#解压的方法很简单
            安装 PM(如果可用,您可以找到新版本!)

            Install-Package Ionic.Zip -Version 1.9.1.8
            

            C#代码

            string zipFile = @"C:\Users\Fesslersoft\Desktop\ZipTest\Test.zip";
            string targetDirectory = @"C:\Users\Fesslersoft\Desktop\ZipTest\";
             
            using (Ionic.Zip.ZipFile zip = Ionic.Zip.ZipFile.Read(zipFile))
            {
                zip.Password = "1234";
                zip.ExtractAll(targetDirectory, Ionic.Zip.ExtractExistingFileAction.DoNotOverwrite);
            }
             
            Console.WriteLine("Zip file has been successfully extracted.");
            Console.Read();
            

            来源:https://codesnippets.fesslersoft.de/extract-a-password-protected-zip-file-using-dotnetzip/

            【讨论】: