119 votes

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

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

Simplement j'ai peut-être voulez extraire les données (fichier) à partir du début d'un fichier zip, évidemment, cela dépend si l'algorithme de compression compresser le fichier dans un déterministe de l'ordre.

150voto

Sinatr Points 2499

Avec .Net Framework 4.5 (à l'aide de ZipArchive):

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

Trouver "monfichier" dans zipfile et l'extraire.

87voto

Nicholas Carey Points 24614

DotNetZip est votre ami ici.

Aussi simple que:

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

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

La lecture du fichier zip de la table des matières 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");

  }
}

20voto

Javi Points 119

Quelque chose comme ce sera la liste et d'en 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 à l'intérieur du fichier zip.

0voto

umilmi81 Points 102

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

0voto

Nickolay Olshevsky Points 8155

Dans de tels cas, vous devez analyser zip local de l'en-tête des entrées. Chaque fichier, stocké dans un fichier zip, a précédé Local en-Tête du Fichier d'entrée, qui (normalement) contient suffisamment d'information pour la décompression, en Général, vous pouvez faire simple analyse de ces inscriptions dans les cours d', choisissez un fichier, une copie de l'en-tête + fichier compressé des données vers d'autres fichiers, et de les appeler décompresser sur cette partie (si vous ne voulez pas avoir affaire avec l'ensemble de décompression Zip code ou de la bibliothèque).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X