Crear ZIP en C#

Los archivos ZIP se utilizan para comprimir y guardar uno o más archivos o carpetas en un solo contenedor. Un archivo ZIP encapsula los archivos y carpetas y también contiene su información de metadatos. El uso más común de archivado es reducir el tamaño de los archivos para almacenamiento o transmisión y aplicar cifrado por seguridad. Además de las herramientas de compresión de archivos, las funciones de compresión/extracción automatizadas también se utilizan en varias aplicaciones web y de escritorio para cargar, descargar, compartir o cifrar los archivos. Este artículo también se enfoca en escenarios similares y presenta algunas formas sencillas de comprimir archivos o carpetas y crear archivos ZIP mediante programación usando C#.

En este artículo, aprenderá a realizar las siguientes operaciones de archivo ZIP:

Requisito previo - Biblioteca ZIP de C#

Aspose.ZIP for .NET es una API poderosa y fácil de usar para comprimir o descomprimir archivos y carpetas dentro de aplicaciones .NET. También proporciona técnicas de cifrado AES para cifrar los archivos en archivos ZIP. Puede instalar la API desde NuGet o descargar sus binarios desde la sección Descargas.

Crear un archivo ZIP en C#

Los siguientes son los pasos para comprimir un archivo agregándolo a un archivo ZIP:

El siguiente ejemplo de código muestra cómo agregar un archivo a un archivo ZIP usando C#.

// Crear FileStream para el archivo ZIP de salida
using (FileStream zipFile = File.Open("compressed_file.zip", FileMode.Create))
{
	// Archivo que se agregará al archivo
	using (FileStream source1 = File.Open("alice29.txt", FileMode.Open, FileAccess.Read))
	{
		using (var archive = new Archive(new ArchiveEntrySettings()))
		{
			// Agregar archivo al archivo
			archive.CreateEntry("alice29.txt", source1);
			// archivo zip
			archive.Save(zipFile);
		}
	}
}

Agregue varios archivos en un archivo ZIP en C#

En caso de que desee agregar varios archivos en un archivo ZIP, puede hacerlo de una de las siguientes maneras.

ZIP varios archivos usando FileStream

En este método, la clase FileStream se usa para agregar archivos al archivo ZIP usando el método Archive.CreateEntry(String, FileStream). El siguiente ejemplo de código muestra cómo agregar varios archivos en un ZIP en C#.

// Crear FileStream para el archivo ZIP de salida
using (FileStream zipFile = File.Open("compressed_files.zip", FileMode.Create))
{
	// Archivo que se agregará al archivo
	using (FileStream source1 = File.Open("alice29.txt", FileMode.Open, FileAccess.Read))
	{
		// Archivo que se agregará al archivo
		using (FileStream source2 = File.Open("asyoulike.txt", FileMode.Open, FileAccess.Read))
		{
			using (var archive = new Archive())
			{
				// Agregar archivos al archivo
				archive.CreateEntry("alice29.txt", source1);
				archive.CreateEntry("asyoulik3.txt", source2);
				// comprimir los archivos
				archive.Save(zipFile, new ArchiveSaveOptions() { Encoding = Encoding.ASCII, ArchiveComment = "two files are compressed in this archive" });
			}
		}
	}
}

ZIP varios archivos usando FileInfo

También puede usar la clase FileInfo para agregar varios archivos a un archivo ZIP. En este método, los archivos se cargarán usando la clase FileInfo y se agregarán al archivo ZIP usando el método Archive.CreateEntry(String, FileInfo). El siguiente ejemplo de código muestra cómo comprimir varios archivos mediante la clase FileInfo en C#.

// Crear FileStream para el archivo ZIP de salida
using (FileStream zipFile = File.Open("compressed_files.zip", FileMode.Create))
{
	// Archivos que se agregarán al archivo
	FileInfo fi1 = new FileInfo("alice29.txt");
	FileInfo fi2 = new FileInfo("fields.c");

	using (var archive = new Archive())
	{
		// Agregar archivos al archivo
		archive.CreateEntry("alice29.txt", fi1);
		archive.CreateEntry("fields.c", fi2);
		// Crear archivo ZIP
		archive.Save(zipFile, new ArchiveSaveOptions() { Encoding = Encoding.ASCII });
	}
}

Archivos ZIP usando la ruta

En lugar de utilizar las clases FileInfo o FileStream para las entradas ZIP, puede proporcionar la ruta del archivo directamente al método Archive.CreateEntry(String name, String path, Boolean openImmediately, ArchiveEntrySettings newEntrySettings). El siguiente ejemplo de código muestra cómo comprimir archivos utilizando su ruta.

// Crear FileStream para el archivo ZIP de salida
using (FileStream zipFile = File.Open("archive.zip", FileMode.Create))
{
    // Crear archivo
    using (var archive = new Archive())
    {
        // Agregar archivo al archivo ZIP
        archive.CreateEntry("data.bin", "file.dat");
        archive.Save(zipFile);
    }
}

Agregar carpetas a un archivo ZIP en C#

También puede comprimir una carpeta, lo que podría ser otra alternativa para agregar varios archivos a un archivo ZIP. Simplemente coloque los archivos de origen en una carpeta y agregue esa carpeta al archivo ZIP. Los siguientes son los pasos para comprimir una carpeta:

El siguiente ejemplo de código muestra cómo agregar una carpeta a ZIP en C#.

// Crear FileStream para el archivo ZIP de salida
using (FileStream zipFile = File.Open("compress_directory.zip", FileMode.Create))
{
	using (Archive archive = new Archive())
	{
		// Carpeta a comprimir
		DirectoryInfo corpus = new DirectoryInfo("CanterburyCorpus");
		archive.CreateEntries(corpus);
		// Crear archivo ZIP
		archive.Save(zipFile);
	}
}

Cree un ZIP protegido con contraseña usando ZipCrypto en C#

Puede proteger los archivos ZIP con contraseñas y aplicar el cifrado ZipCrypto. Para ello se utiliza la clase ArchiveEntrySettings en el constructor del Archive que acepta el tipo de cifrado como segundo parámetro.

El siguiente ejemplo de código muestra cómo crear un archivo ZIP protegido con contraseña mediante ZipCrypto en C#.

// Crear FileStream para el archivo ZIP de salida
using (FileStream zipFile = File.Open("compress_directory.zip", FileMode.Create))
{
	using (Archive archive = new Archive(new ArchiveEntrySettings(null, new TraditionalEncryptionSettings("p@s$"))))
	{
		// Agregar carpeta al archivo
		DirectoryInfo corpus = new DirectoryInfo("CanterburyCorpus");
		archive.CreateEntries(corpus);
		// Crear archivo ZIP
		archive.Save(zipFile);
	}
}

C# Crear ZIP protegido con contraseña con cifrado AES

Aspose.ZIP for .NET también le permite aplicar el cifrado AES para proteger los archivos ZIP. Puede utilizar los siguientes métodos de cifrado AES:

  • AES128
  • AES192
  • AES256

Para aplicar el cifrado AES, la API ofrece la clase AesEcryptionSettings. El siguiente ejemplo de código muestra cómo crear un ZIP protegido con contraseña con cifrado AES en C#.

// Crear FileStream para el archivo ZIP de salida
using (FileStream zipFile = File.Open("compress_directory.zip", FileMode.Create))
{
	using (Archive archive = new Archive(new ArchiveEntrySettings(null, new AesEcryptionSettings("p@s$", EncryptionMethod.AES128))))
	{
		// Agregar carpeta al archivo
		DirectoryInfo corpus = new DirectoryInfo("CanterburyCorpus");
		archive.CreateEntries(corpus);
		// Crear archivo ZIP
		archive.Save(zipFile);
	}
}

Establecer el modo de compresión paralela

También puede configurar la API para compresión paralela en caso de múltiples entradas. Para esto, puede especificar el modo de compresión paralela usando la clase ParallelOptions. Aspose.ZIP for .NET proporciona los siguientes modos de compresión en paralelo.

  • Never - No comprima en paralelo.
  • Always: comprima en paralelo (cuidado con la memoria).
  • Auto: decida si usar o no la compresión paralela en las entradas. Esta opción puede comprimir algunas entradas solo en paralelo.

El siguiente ejemplo de código muestra cómo establecer el modo de compresión en paralelo al comprimir varios archivos.

// Para obtener ejemplos completos y archivos de datos, vaya a https://github.com/aspose-zip/Aspose.ZIP-for-.NET
using (FileStream zipFile = File.Open(dataDir + "UsingParallelismToCompressFiles_out.zip", FileMode.Create))
{
    using (FileStream source1 = File.Open(dataDir + "alice29.txt", FileMode.Open, FileAccess.Read))
    {
        using (FileStream source2 = File.Open(dataDir + "asyoulik.txt", FileMode.Open, FileAccess.Read))
        {
            using (var archive = new Archive())
            {
                archive.CreateEntry("alice29.txt", source1);
                archive.CreateEntry("asyoulik.txt", source2);
                //Definir el criterio de paralelismo
                var parallelOptions = new ParallelOptions
                {
                    ParallelCompressInMemory = ParallelCompressionMode.Always
                };
                archive.Save(zipFile,
                    new ArchiveSaveOptions()
                    {
                        ParallelOptions = parallelOptions,
                        Encoding = Encoding.ASCII,
                        ArchiveComment = "There are two poems from Canterbury corpus"
                    });
            }
        }
    }
}

Más información sobre Aspose.ZIP for .NET

Explore más sobre nuestra API C# ZIP utilizando los siguientes recursos:

Conclusión

En este artículo, ha aprendido a crear archivos ZIP mediante programación en C#. Los ejemplos de código han demostrado cómo agregar archivos y carpetas en los archivos ZIP. Además, también hemos cubierto cómo crear archivos ZIP protegidos con contraseña con los métodos de cifrado ZipCrypto y AES en C#. Además, la compresión paralela de múltiples entradas también se analiza al final. En caso de que tenga alguna pregunta o consulta, puede preguntarnos a través de nuestro foro.

Ver también