使用 DotNetZip 打开拆分 Zip 文件

Posted

技术标签:

【中文标题】使用 DotNetZip 打开拆分 Zip 文件【英文标题】:Opening Split Zip Files With DotNetZip 【发布时间】:2017-08-03 21:49:29 【问题描述】:

我正在尝试使用 DotNetZip 库从 zip 文件中提取文件。当它是单个 .zip 文件时,我能够提取文件。但是,当我尝试从Something.zip.0 或Something.zip.1 等多卷zip 文件中提取文件时,出现以下两个异常:

-抛出异常:Ionic.Zip.dll 中的“Ionic.Zip.BadReadException”

-抛出异常:Ionic.Zip.dll 中的“Ionic.Zip.ZipException”

DotNetZip 是否可以读取这些类型的文件,或者我应该寻找一种替代方法?我正在使用 C# 开发 Visual Studio。

这是我如何实现 zip 文件提取的 sn-p。

using (Ionic.Zip.ZipFile zip = Ionic.Zip.ZipFile.Read(_pathToZip))
    
        zip.CompressionLevel = Ionic.Zlib.CompressionLevel.BestSpeed;
        foreach(Ionic.Zip.ZipEntry ze in zip)
            
                string fileName = ze.FileName;
                bool isThereItemToExtract = isThereMatch(fileName.ToLower(), _folderList, _fileList);
                if (isThereItemToExtract)
                    
                    string pathOfFileToExtract = (_destinationPath + "\\" + ze.FileName).Replace('/', '\\'); 
                    string pathInNewZipFile = goUpOneDirectoryRelative(ze.FileName);  
                    ze.Extract(_destinationPath, Ionic.Zip.ExtractExistingFileAction.OverwriteSilently);   
                    _newZip.AddItem(pathOfFileToExtract, pathInNewZipFile);   
                
            
        _newZip.Save();  
    

【问题讨论】:

【参考方案1】:

请参考DotNetZipLibrary code examples:

using Ionic.Zip;

private void MyExtract(string zipToUnpack, string unpackDirectory)

    using (ZipFile zip1 = ZipFile.Read(zipToUnpack))
    
          // here, we extract every entry, but we could extract conditionally
          // based on entry name, size, date, checkbox status, etc.  
         foreach (ZipEntry e in zip1)
         
            e.Extract(unpackDirectory, ExtractExistingFileAction.OverwriteSilently);
         
     
  

此方法应该能够提取拆分和不拆分的 zip 文件。 每个 zip 条目都将使用 zip 存档中指定的完整路径提取,相对于当前的 unpackDirectory。

无需检查 zip 条目是否存在 (isThereItemToExtract)。用 foreach 交互 zip 条目应该可以完成这项工作。 为避免冲突,您需要检查 unpackDirectory 中是否存在与 zipEntry 同名的文件,或使用 ExtractExistingFileAction.OverwriteSilently 标志。

DotNetZip 是否可以读取这些类型的文件,或者我应该寻找一种替代方法?我正在使用 C# 开发 Visual Studio。

根据我的经验,这是处理拆分 zip 文件的最佳库。

【讨论】:

感谢@michal-kandel 的回复。我已经尝试过这种方法,但它不适用于我正在使用的拆分 zip 文件。但是,我可以通过调用 7z 可执行文件来解决这个问题。 在此代码示例中,我只能看到将路径传递给单个 ZIP 文件的位置。我已经尝试了第一个和最后一个部分以及“。*”只是为了尝试它。这些都不起作用。我不需要传入一组路径字符串吗? Ionic.Zip 基础架构将能够自行查找和读取它们。只需确保将所有拆分部分存储在与主 zip 文件相同的位置并保留其原始命名即可。

以上是关于使用 DotNetZip 打开拆分 Zip 文件的主要内容,如果未能解决你的问题,请参考以下文章

C# .NET 使用第三方类库DotNetZip解压/压缩Zip文件

dotnetzip 创建空的损坏文件

防止 DotNetZip 创建额外的文件夹

C# .NET 使用DotNetZip开源类库 处理 压缩/解压 Zip 处理乱码情况

ASP.Net MVC——DotNetZip简单使用,解决文件压缩问题。

在 dotnet core 中打开和编辑受密码保护的 zip