2010-03-09 5 views
8

Essayer d'extraire des fichiers dans un dossier donné en ignorant le chemin dans le fichier zip, mais il ne semble pas y avoir de chemin.DotNetZip: Comment extraire des fichiers, mais en ignorant le chemin dans le fichier zip?

Cela semble une exigence assez basique étant donné toutes les autres bonnes choses implémentées là-bas.

Qu'est-ce que je suis absent?

Code

est -

using (Ionic.Zip.ZipFile zf = Ionic.Zip.ZipFile.Read(zipPath)) 
{ 
    zf.ExtractAll(appPath); 
} 
+0

Je suis à la recherche d'une solution similaire, mais je voudrais enlever seulement la première étape de tout le contenu des fichiers ... par exemple/ma solution/fichier/file1.txt devient/fichier/fichier1.txt. Toute ressource pour cela? – atwellpub

Répondre

12

Vous devrez enlever la partie du répertoire du nom de fichier juste avant décompressé ...

using (var zf = Ionic.Zip.ZipFile.Read(zipPath)) 
{ 
    zf.ToList().ForEach(entry => 
    { 
     entry.FileName = System.IO.Path.GetFileName(entry.FileName); 
     entry.Extract(appPath); 
    }); 
} 
+0

doh! Je n'ai pas pensé à ça :) merci beaucoup – Kumar

+0

Je reçois une erreur qui dit "Propriété ou indexeur est en lecture seule" ...... Aide! – pek

+0

Est-ce que cela fonctionne avec les répertoires imbriqués? –

1

Cela échouera s'il y a 2 fichiers avec la même noms de fichiers. Par exemple fichiers \ additionalfiles \ file1.txt temp \ file1.txt

Premier fichier sera renommé FILE1.TXT dans le fichier zip et lorsque le second fichier tente de renommer une exception est levée en disant qu'un élément avec la même clé existe déjà

18

Alors que vous ne pouvez pas spécifier pour un appel spécifique à Extract() ou ExtractAll(), la classe ZipFile a un champ FlattenFoldersOnExtract. Lorsque la valeur true, il aplanit tous les fichiers extraits dans un dossier:

var flattenFoldersOnExtract = zip.FlattenFoldersOnExtract; 
zip.FlattenFoldersOnExtract = true; 
zip.ExtractAll(); 
zip.FlattenFoldersOnExtract = flattenFoldersOnExtract; 
+4

Cela devrait être la réponse acceptée ([doc DontNetZip] (http://dotnetzip.herobo.com/DNZHelp/html/4970c6e8-c169-3ecc-b5f2-8ba9b354c51d.htm)). L'autre solution est une solution de contournement: il renomme le fichier dans le zip avant de l'extraire. –

0

Vous pouvez utiliser la surcharge qui prend un cours d'eau en tant que paramètre. De cette façon, vous avez le contrôle total du chemin où les fichiers seront extraits.

Exemple:

using (ZipFile zip = new ZipFile(ZipPath)) 
{ 
    foreach (ZipEntry e in zip) 
    { 
     string newPath = Path.Combine(FolderToExtractTo, e.FileName); 

     if (e.IsDirectory) 
     { 
      Directory.CreateDirectory(newPath); 
     } 
     else 
     { 
      using (FileStream stream = new FileStream(newPath, FileMode.Create)) 
      e.Extract(stream); 
     } 
    } 
} 
Questions connexes