web-dev-qa-db-fra.com

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

Existe-t-il de toute façon en .Net (C #) pour extraire des données d’un fichier Zip sans décompresser l’ensemble du fichier?

Simplement je veux éventuellement extraire des données (fichier) depuis le début d’un fichier Zip, évidemment cela dépend si l’algorithme de compression compresse le fichier dans un ordre déterministe.

89
AwkwardCoder

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 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");

  }
}

Modifié dans Remarque: DotNetZip vivait chez Codeplex. Codeplex a été arrêté. L'ancienne archive est toujours disponible sur Codeplex . Il semble que le code a migré vers Github:


77
Nicholas Carey

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.

100
Sinatr

Quelque chose comme ceci va lister 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

18
Javi

Voici comment un fichier texte UTF8 peut être lu à partir d’une archive Zip dans une variable chaîne (.NET Framework 4.5 et versions supérieures):

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());
6
ShamilS

Dans ce cas, vous devrez analyser les entrées d'en-tête local Zip. Chaque fichier, stocké dans un fichier Zip, est précédé d’une entrée d’en-tête de fichier local, qui contient (en principe) suffisamment d’informations pour la décompression. fichier et appelez unzip sur cette partie (si vous ne voulez pas vous occuper de tout le code de décompression Zip ou de la bibliothèque).

0

Les fichiers zip ont une table des matières. Chaque utilitaire Zip doit pouvoir interroger uniquement la table des matières. Vous pouvez également utiliser un programme en ligne de commande tel que 7Zip -t pour imprimer la table des matières et la rediriger vers un fichier texte.

0
umilmi81