Comment lire les données d'un fichier zip sans avoir à décompresser le fichier entier


97

Existe-t-il de toute façon dans .Net (C #) pour extraire des données d'un fichier zip sans décompresser le fichier complet?

Simplement, je veux peut-être extraire des données (fichier) à partir du début d'un fichier zip, cela dépend évidemment si l'algorithme de compression compresse le fichier dans un ordre déterministe.


Réponses:


78

DotNetZip est votre ami ici.

Aussi facile que:

using (ZipFile zip = ZipFile.Read(ExistingZipFile))
{
  ZipEntry e = zip["MyReport.doc"];
  e.Extract(OutputStream);
}

(vous pouvez également extraire vers un fichier ou d'autres destinations).

La lecture de la table des matières du fichier zip est aussi simple que:

using (ZipFile zip = ZipFile.Read(ExistingZipFile))
{
  foreach (ZipEntry e in zip)
  {
    if (header)
    {
      System.Console.WriteLine("Zipfile: {0}", zip.Name);
      if ((zip.Comment != null) && (zip.Comment != "")) 
        System.Console.WriteLine("Comment: {0}", zip.Comment);
      System.Console.WriteLine("\n{1,-22} {2,8}  {3,5}   {4,8}  {5,3} {0}",
                               "Filename", "Modified", "Size", "Ratio", "Packed", "pw?");
      System.Console.WriteLine(new System.String('-', 72));
      header = false;
    }
    System.Console.WriteLine("{1,-22} {2,8} {3,5:F0}%   {4,8}  {5,3} {0}",
                             e.FileName,
                             e.LastModified.ToString("yyyy-MM-dd HH:mm:ss"),
                             e.UncompressedSize,
                             e.CompressionRatio,
                             e.CompressedSize,
                             (e.UsesEncryption) ? "Y" : "N");

  }
}

Édité à noter: DotNetZip vivait à Codeplex. Codeplex a été arrêté. L'ancienne archive est toujours disponible chez Codeplex . Il semble que le code a migré vers Github:



9
+1. Dans les coulisses, ce que fait DotNetZip dans le constructeur est de rechercher le «répertoire» à l'intérieur du fichier zip, puis de le lire et de remplir la liste des entrées. À ce stade, si votre application appelle Extract () sur une entrée, DotNetZip recherche l'emplacement approprié dans le fichier zip et décompresse les données pour cette entrée uniquement.
Cheeso

115

Avec .Net Framework 4.5 (en utilisant ZipArchive ):

using (ZipArchive zip = ZipFile.Open(zipfile, ZipArchiveMode.Read))
    foreach (ZipArchiveEntry entry in zip.Entries)
        if(entry.Name == "myfile")
            entry.ExtractToFile("myfile");

Trouvez "myfile" dans zipfile et extrayez-le.


35
On peut également utiliser entry.Open () pour obtenir simplement le flux (si le contenu doit être lu mais pas écrit dans un fichier).
anre

17
références: System.IO.Compression.dlletSystem.IO.Compression.FileSystem.dll
yzorg

18

Quelque chose comme ça va lister et extraire les fichiers un par un, si vous souhaitez utiliser SharpZipLib:

var zip = new ZipInputStream(File.OpenRead(@"C:\Users\Javi\Desktop\myzip.zip"));
var filestream = new FileStream(@"C:\Users\Javi\Desktop\myzip.zip", FileMode.Open, FileAccess.Read);
ZipFile zipfile = new ZipFile(filestream);
ZipEntry item;
while ((item = zip.GetNextEntry()) != null)
{
     Console.WriteLine(item.Name);
     using (StreamReader s = new StreamReader(zipfile.GetInputStream(item)))
     {
      // stream with the file
          Console.WriteLine(s.ReadToEnd());
     }
 }

Basé sur cet exemple: contenu dans un fichier zip


1
Franchement, je ne pouvais pas voir comment ce lien répond à la question.
Rappel d'Eugene Mayevski

10

Voici comment un fichier texte UTF8 peut être lu à partir d'une archive zip dans une variable de chaîne (.NET Framework 4.5 et plus):

string zipFileFullPath = "{{TypeYourZipFileFullPathHere}}";
string targetFileName = "{{TypeYourTargetFileNameHere}}";
string text = new string(
            (new System.IO.StreamReader(
             System.IO.Compression.ZipFile.OpenRead(zipFileFullPath)
             .Entries.Where(x => x.Name.Equals(targetFileName,
                                          StringComparison.InvariantCulture))
             .FirstOrDefault()
             .Open(), Encoding.UTF8)
             .ReadToEnd())
             .ToArray());

0

Les fichiers Zip ont une table des matières. Chaque utilitaire zip doit avoir la capacité d'interroger uniquement la table des matières. Ou vous pouvez utiliser un programme de ligne de commande comme 7zip -t pour imprimer la table des matières et la rediriger vers un fichier texte.


0

Dans ce cas, vous devrez analyser les entrées d'en-tête locales zip. Chaque fichier, stocké dans un fichier zip, a une entrée d'en-tête de fichier local qui (normalement) contient suffisamment d'informations pour la décompression.En règle générale, vous pouvez effectuer une analyse simple de ces entrées dans le flux, sélectionner le fichier nécessaire, copier l'en-tête + les données du fichier compressé vers d'autres fichier, et appelez unzip sur cette partie (si vous ne voulez pas gérer tout le code de décompression Zip ou la bibliothèque).

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.