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.

AwkwardCoder
la source

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:


Nicolas Carey
la source
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.

Sinatr
la source
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

Javi
la source
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());
ShamilS
la source
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.

umilmi81
la source
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).

Nickolay Olshevsky
la source