2017-08-03 63 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文件的最佳庫。