11
votes

DotNetZip: Comment extraire des fichiers, mais ignorer le chemin dans le zipfile?

essayer d'extraire des fichiers dans un dossier donné en ignorant le chemin dans le zipfile, mais il ne semble pas y avoir de moyen.

Ceci semble une exigence assez fondamentale donnée à toutes les autres bonnes choses mises en œuvre là-bas.

Qu'est-ce que je manque?

code est - xxx


2 commentaires

Je cherche une solution similaire mais je voudrais seulement supprimer la première étape de tous les fichiers contenus ... par exemple / ma solution / fichier / fichier1.txt devient /file/file1.txt. Toute ressource pour cela?


Découvrez Stackoverflow.com/Questtions/6202267/... @atwellpub


4 Réponses :


15
votes

Vous devrez supprimer la partie répertoire du nom de fichier juste avant de décompresser ...

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


1 commentaires

Pourquoi ZF.Tolist (). Foreach (entrée => {...}) au lieu de foreach (entrée varié dans zf.entries) {} ? Y a-t-il une différence?



1
votes

Cela échouera s'il y a 2 fichiers avec des noms de fichiers égaux. Par exemple Fichiers \ supplémentairesFiles \ File1.txt temp \ file1.txt

premier fichier sera renommé à File1.txt dans le fichier ZIP et lorsque le deuxième fichier tente d'être renommé une exception est lancé en disant qu'un élément de la même clé existe déjà


0 commentaires

23
votes

Bien que vous ne puissiez pas le spécifier pour un appel spécifique à extraire () ou extrayant () , la classe zipfile a un < Code> FlattenfoldSonExtract champ. Lorsqu'il est défini sur true, il aplatit tous les fichiers extraits dans un dossier: xxx



1
votes

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

Exemple: P>

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);
        }
     }
}


1 commentaires

Merci, cela a travaillé! J'ai continué à obtenir "un élément avec la même clé a déjà été ajouté" des erreurs avec celle marquée comme réponse (peut-être une erreur de ma part, mais de toute façon).