2017-08-03 8 views
2

J'essaie d'extraire des fichiers à partir de fichiers zip en utilisant la bibliothèque DotNetZip. Je suis capable d'extraire des fichiers lorsqu'il s'agit d'un seul fichier .zip. Cependant, lorsque j'essaie d'extraire des fichiers à partir d'un fichier zip multi-volumes tel que Something.zip.0 ou Something.zip.1, j'obtiens les deux exceptions suivantes:Ouverture de fichiers Zip Split avec DotNetZip

-Exception levée: 'Ionic.Zip.BadReadException' dans Ionic.Zip.dll

-Exception jeté: 'Ionic.Zip.ZipException' dans Ionic.Zip.dll

est-il possible DotNetZip lire ce type de fichiers, ou devrais-je être à la recherche dans une alternative approche? Je travaille sur Visual Studios en utilisant C#.

Voici un extrait de la façon dont j'implémente mon extraction de fichier 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(); 
    } 

Répondre

1

S'il vous plaît consulter le 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); 
     } 
    } 
    } 

Cette méthode devrait être en mesure d'extraire soit partagé et non diviser des fichiers zip. Chaque entrée zip sera extraite avec son chemin d'accès complet tel que spécifié dans l'archive zip, par rapport à unpackDirectory courant.

  • Il n'est pas nécessaire de vérifier si l'entrée zip existe (isThereItemToExtract). Interaction des entrées zip avec foreach devrait faire le travail.
  • Pour éviter les collisions, vous devez vérifier si le fichier portant le même nom que zipEntry existe dans unpackDirectory ou utiliser l'attribut ExtractExistingFileAction.OverwriteSilently.

Est-il possible pour DotNetZip lire ce type de fichiers, ou devrais-je être à la recherche dans une autre approche? Je travaille sur Visual Studios en utilisant C#.

Dans mon expérience, c'est la meilleure bibliothèque pour traiter les fichiers zip fractionnés.