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

y a-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 éventuellement extraire des données (fichier) du début d'un fichier zip, évidemment cela dépend si l'algorithme de compression compresse le fichier dans un ordre déterministe.

75
demandé sur JYelton 2011-05-11 20:54:16

6 réponses

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).

Lire la table des matières du fichier zip est aussi facile 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 l'habitude de vivre sur Codeplex. Codeplex a été arrêté. L'ancienne archive est toujours disponible au Codeplex . On dirait que le code a migré vers Github:


68
répondu Nicholas Carey 2018-04-18 18:52:49

avec .net Framework 4.5 (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.

84
répondu Sinatr 2013-02-07 14:45:38

quelque chose comme ceci va énumérer et extraire les fichiers un par un, si vous voulez 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 le fichier zip

15
répondu Javi 2017-05-23 12:18:12

Voici comment un fichier texte UTF8 peut être lu à partir d'une archive zip dans une variable string (.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());
1
répondu ShamilS 2016-04-21 07:36:57
Les fichiers Zip

ont une table des matières. Chaque utilitaire zip devrait avoir la possibilité d'interroger seulement le TOC. Vous pouvez aussi utiliser un programme en ligne de commande comme 7zip-t pour imprimer la table des matières et la rediriger vers un fichier texte.

0
répondu umilmi81 2011-05-11 17:06:33

dans ce cas, vous devrez analyser les entrées en-tête zip local. Chaque fichier, stocké dans le fichier zip, a précédé l'en-tête du fichier Local, qui (normalement) contient assez d'informations pour la décompression, généralement, vous pouvez faire simple analyse de ces entrées dans le flux, sélectionner le fichier nécessaire, copier l'en-tête + données de fichier compressé à l'autre fichier, et appeler unzip sur cette partie (si vous ne voulez pas traiter l'ensemble du code de décompression Zip ou de la bibliothèque).

0
répondu Nickolay Olshevsky 2011-05-11 18:09:19