A menudo, obtiene un archivo ZIP que contiene otros archivos ZIP en su interior formando una estructura anidada de los archivos. En tales casos, es posible que desee obtener una estructura plana extrayendo todos los archivos ZIP internos al archivo externo. Para realizar esta operación mediante programación, este artículo muestra cómo crear un archivo ZIP plano en C#.

C# .NET API para crear archivos ZIP planos

Para crear los archivos ZIP planos, usaremos Aspose.ZIP for .NET. Es una API de archivo que está diseñada para crear y extraer formatos de archivo populares, incluidos ZIP, TAR, GZip y 7z. Puede instalar la API desde NuGet o descargar su archivo DLL desde la sección de descargas.

PM> Install-Package Aspose.Zip

Crear un archivo ZIP plano en C#

Para comprender la estructura de un archivo ZIP plano, tomemos un ejemplo. El siguiente es un archivo ZIP que contiene otro archivo ZIP en su interior.

parent.zip
 ├first.txt
 ├inner.zip
 │ ├game.exe
 │ └subitem.bin
 └picture.gif

Después de transformar este archivo ZIP en un ZIP plano, todas las entradas del ZIP interno se extraerán al ZIP principal. Finalmente, obtendremos la siguiente estructura del ZIP principal.

flatten.zip
 ├first.txt
 ├picture.gif
 ├game.exe
 └subitem.bin

Veamos cómo realizar esta transformación mediante programación. Los siguientes son los pasos para crear un archivo ZIP plano en C#.

  • Primero, cargue el archivo ZIP principal usando la clase Archive.
  • Luego, cree listas para almacenar las entradas del ZIP interno para eliminar del ZIP principal, las entradas extraídas y sus nombres.
  • Después de eso, recorra cada ArchiveEntry en el ZIP principal usando la colección Archive.Entries.
  • Para cada entrada, realice las siguientes operaciones:
    • Compruebe si la entrada es un archivo ZIP utilizando el método ArchiveEntry.Name.EndsWith(".zip", StringComparison.InvariantCultureIgnoreCase)).
    • Luego, agregue la entrada a la lista de entradas para eliminar.
    • Abra la entrada en un objeto MemoryStream utilizando el método ArchiveEntry.Open().CopyTo(MemoryStream).
    • Repita las entradas del archivo ZIP interno y, en cada iteración, realice los siguientes pasos.
      • Agregue el nombre de la entrada a la lista de entradas que se agregarán.
      • Luego, cargue la entrada a MemoryStream usando el método ArchiveEntry.Open().CopyTo(MemoryStream).
      • Finalmente, agregue una entrada a la lista de entradas que se agregarán al ZIP principal.
  • Luego, recorra la lista de archivos ZIP internos y elimine cada entrada usando el método Archive.DeleteEntry(ArchiveEntry).
  • Recorra la lista de entradas que se agregarán al ZIP principal y agregue cada entrada usando el método Archive.CreateEntry(String, Stream).
  • Finalmente, guarde el archivo ZIP principal usando el método Archive.Save(String).

El siguiente ejemplo de código muestra cómo crear un archivo ZIP plano en C#.

// Cargar archivo ZIP
using (Archive outer = new Archive("Archives/nested-archive.zip"))
{
    // Cree una lista para eliminar las entradas ZIP internas después de la extracción
    List<ArchiveEntry> entriesToDelete = new List<ArchiveEntry>();

    // Cree una lista para agregar nombres de archivos en archivos ZIP internos
    List<string> namesToInsert = new List<string>();

    // Cree una lista para agregar objetos de flujo de archivos en archivos ZIP internos
    List<MemoryStream> contentToInsert = new List<MemoryStream>();

    // Recorra las entradas en el ZIP principal
    foreach (ArchiveEntry entry in outer.Entries)
    {
        // Compruebe si la entrada es un archivo ZIP
        if (entry.Name.EndsWith(".zip", StringComparison.InvariantCultureIgnoreCase)) 
        {
            // Agregue una entrada a la lista para mantener la referencia a fin de eliminarla del archivo más tarde
            entriesToDelete.Add(entry); 

            // Crear objeto de flujo para abrir el archivo ZIP
            MemoryStream innerCompressed = new MemoryStream();
            entry.Open().CopyTo(innerCompressed);

            // Cargue el archivo ZIP desde el objeto de flujo 
            using (Archive inner = new Archive(innerCompressed))
            {
                // Bucle sobre las entradas del archivo
                foreach (ArchiveEntry ie in inner.Entries) 
                {
                    // Mantener el nombre de la entrada en la lista
                    namesToInsert.Add(ie.Name); 

                    // Extraiga la entrada del archivo en un objeto de flujo
                    MemoryStream content = new MemoryStream();
                    ie.Open().CopyTo(content);

                    // Agregar entrada a la lista
                    contentToInsert.Add(content);
                }
            }
        }
    }

    // Eliminar los archivos ZIP internos
    foreach (ArchiveEntry e in entriesToDelete)
        outer.DeleteEntry(e);

    // Inserte los archivos de los archivos ZIP internos en el archivo ZIP principal
    for (int i = 0; i < namesToInsert.Count; i++)
        outer.CreateEntry(namesToInsert[i], contentToInsert[i]);

    outer.Save("Archives/flatten.zip");
}

Obtenga una licencia de API gratuita

Puede obtener una licencia temporal gratuita para usar Aspose.ZIP for .NET sin limitaciones de evaluación.

Conclusión

En este artículo, ha aprendido a crear un archivo ZIP plano mediante programación en C#. En particular, hemos demostrado cómo hacer un ZIP plano extrayendo los archivos ZIP internos al ZIP principal. Aparte de eso, puede visitar la documentación para leer más sobre Aspose.ZIP for .NET. Además, puede compartir sus consultas con nosotros a través de nuestro foro.

Ver también