Pregunta Cómo leer datos de un archivo zip sin tener que descomprimir todo el archivo


¿Hay alguna forma en .Net (C #) para extraer datos de un archivo zip sin descomprimir el archivo completo?

Simplemente quiero posiblemente extraer datos (archivos) desde el inicio de un archivo comprimido, obviamente esto depende de si el algoritmo de compresión comprime el archivo en un orden determinista.


73
2018-05-11 16:54


origen


Respuestas:


DotNetZip es tu amigo aquí

Tan fácil como:

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

(También puede extraer a un archivo u otros destinos).

Leer la tabla de contenido del archivo comprimido es tan fácil como:

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

  }
}

Editado a la nota: DotNetZip solía vivir en Codeplex. Codeplex ha sido cerrado. El archivo antiguo todavía está disponible en Codeplex. Parece que el código ha migrado a Github:



66
2018-05-11 17:54



Con .Net Framework 4.5 (usando ZipArchive)

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

Encuentra "myfile" en zipfile y extráelo.


82
2018-02-07 14:45



Algo como esto mostrará una lista y extraerá los archivos uno por uno, si desea usar 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());
     }
 }

Basado en este ejemplo: contenido dentro de un archivo zip


14
2018-05-11 17:01



Aquí se explica cómo se puede leer un archivo de texto UTF8 desde un archivo zip en una variable de cadena (.NET Framework 4.5 y superior):

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
2018-04-21 07:36



Los archivos zip tienen una tabla de contenidos. Cada utilidad de compresión debe tener la capacidad de consultar solo el TOC. O puede usar un programa de línea de comando como 7zip -t para imprimir la tabla de contenido y redirigirla a un archivo de texto.


0
2018-05-11 17:06



En tal caso, deberá analizar las entradas del encabezado local zip. Cada archivo, almacenado en archivo zip, tiene una entrada de encabezado de archivo local anterior, que (normalmente) contiene suficiente información para la descompresión. Generalmente, puede realizar un análisis simple de tales entradas en la secuencia, seleccionar el archivo necesario, copiar el encabezado + datos de archivo comprimido a otra archivo, y llamada descomprimir en esa parte (si no desea tratar con todo el código de descompresión Zip o la biblioteca).


0
2018-05-11 18:09