使用DotNetZip打开分割的Zip文件

3
我正在尝试使用DotNetZip库从zip文件中提取文件。当它是单个.zip文件时,我可以提取文件。然而,当我尝试从多卷zip文件(如 Something.zip.0 或 Something.zip.1)中提取文件时,我会得到以下两个异常:
-Ionic.Zip.dll 中引发异常:“Ionic.Zip.BadReadException”
-Ionic.Zip.dll 中引发异常:“Ionic.Zip.ZipException”
DotNetZip能否读取这些类型的文件?还是我应该寻找其他方法?我是在使用C#的Visual Studios上工作。
以下是我实现zip文件提取的片段。
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个回答

2
请参考 DotNetZipLibrary代码示例:
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条目即可完成工作。
  • 为避免冲突,您需要检查与zipEntry同名的文件是否存在于unpackDirectory中,或者使用ExtractExistingFileAction.OverwriteSilently标志。

DotNetZip能否读取这些类型的文件,还是我应该寻找替代方案?我正在使用C#的Visual Studios进行开发。

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


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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接