2017-08-03 60 views
2

我想从使用DotNetZip库的zip文件中提取文件。当它是单个.zip文件时,我可以提取文件。但是,当我尝试从多卷ZIP文件(如Something.zip.0或Something.zip.1)中提取文件时,我会得到以下两个例外:用DotNetZip打开分割Zip文件

-Exception thrown:'Ionic.Zip.BadReadException'in Ionic.Zip.dll

-Exception抛出:“Ionic.Zip.ZipException”在Ionic.Zip.dll

是否有可能为DotNetZip阅读这些类型的文件,或者我应该寻找到一个替代进场?我正在使用C#开发Visual Studio。

这是我如何实现我的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

请参考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); 
     } 
    } 
    } 

这种方法应该能够提取任意分割,而不是拆分压缩文件。 相对于当前的unpackDirectory,每个zip条目将被提取其zip文件中指定的完整路径。

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

是否有可能为DotNetZip阅读这些类型的文件,或者我应该寻找到一个替代办法?我正在使用C#开发Visual Studio。

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