web-dev-qa-db-fra.com

Extraire un fichier Zip par programmation par la bibliothèque DotNetZip?

J'ai une fonction qui récupère un fichier Zip et l'extrait dans un répertoire (j'utilise la bibliothèque DotNetZip .)

public void ExtractFileToDirectory(string zipFileName, string outputDirectory)
{
     ZipFile Zip = ZipFile.Read(zipFileName);
     Directory.CreateDirectory(outputDirectory);
     Zip.ExtractAll(outputDirectory,ExtractExistingFileAction.OverwriteSilently);
}

Mon fichier Zip contient plusieurs fichiers et répertoires. Mais je veux extraire seulement certains de ces fichiers, pas tous.

Comment puis-je faire fonctionner cela?

32
Ehsan

Vous devez tester chaque ZipEntry pour voir si vous voulez l'extraire:

public void ExtractFileToDirectory(string zipFileName, string outputDirectory)
{
     ZipFile Zip = ZipFile.Read(zipFileName);
     Directory.CreateDirectory(outputDirectory);
      foreach (ZipEntry e in Zip)
      {
        // check if you want to extract e or not
        if(e.FileName == "TheFileToExtract") 
          e.Extract(outputDirectory, ExtractExistingFileAction.OverwriteSilently);
      }
}

.

ZipFile Zip = ZipFile.Read(zipFileName); //Runs in framework 4.5
39
Oded

Il existe une méthode ExtractSelectedEntries dans la classe ZipFile. voici la signature de la méthode.

public void ExtractSelectedEntries(string selectionCriteria, string directoryPathInArchive, string extractDirectory, ExtractExistingFileAction extractExistingFile)

Ainsi, dans votre programme, vous pouvez simplement extraire les fichiers spécifiés en fournissant les critères de sélection.

public void ExtractFileToDirectory(string zipFileName, string outputDirectory)
{
     ZipFile Zip = ZipFile.Read(zipFileName);
     Directory.CreateDirectory(outputDirectory);
     Zip.ExtractSelectedEntries("name = *.doc", "document\", outputDirectory, ExtractExistingFileAction.OverwriteSilently);
}

Vous pouvez combiner des critères avec les conjonctions ET ou OU. L'utilisation d'une chaîne telle que "name = * .txt AND size> = 100k" pour selectionCriteria récupère les entrées dont les noms se terminent par .txt et dont la taille non compressée est supérieure ou égale à 100 kilo-octets.

voici quelques exemples de critères


critères (fichiers récupérés)

name! = * .xls (tout fichier dont l'extension n'est pas .xls)

name = * .mp3 (tout fichier avec une extension .mp3)

* .mp3 (comme ci-dessus, tout fichier avec une extension .mp3)

attributs = A (tous les fichiers dont les attributs incluent le bit d'archive)

attributs! = H (tous les fichiers dont les attributs n'incluent pas le bit caché)

mtime> 2009-01-01 (tous les fichiers dont la dernière heure a été modifiée après le 1er janvier 2009)

taille> 2 Go (tous les fichiers dont la taille non compressée est supérieure à 2 Go)


Pour plus de référence, vous devez lire le document API seul avec la bibliothèque.

21
misaxi

Vous pouvez également utiliser LINQ pour sélectionner les entrées que vous souhaitez extraire. Par exemple:

using (var Zip = ZipFile.Read(ArchiveToRead))
{
    var selection = from e in Zip.Entries
        where System.IO.Path.GetFileName(e.FileName).StartsWith("C")
        select e;

    foreach (var e in selection)
        e.Extract(extractDir);
}

Bien sûr, vous pouvez utiliser les critères de requête de votre choix dans la clause where.

13
Cheeso