Comprimir / Descomprimir carpetas y archivos

votos
42

¿Alguien sabe de una buena manera de comprimir o descomprimir archivos y carpetas en C # rápidamente? Puede ser necesario manejar archivos grandes.

Publicado el 01/08/2008 a las 18:13
fuente por usuario
En otros idiomas...                            


9 respuestas

votos
24

El espacio de nombres de marco .NET 2.0 es System.IO.Compressioncompatible con los algoritmos GZip y Deflate. Aquí hay dos métodos que comprimen y descomprimen una secuencia de bytes que puede obtener de su objeto de archivo. Puede subsitute GZipStreamde DefaultStreamlos métodos a continuación para utilizar ese algoritmo. Sin embargo, esto deja el problema de manejar archivos comprimidos con diferentes algoritmos.

public static byte[] Compress(byte[] data)
{
    MemoryStream output = new MemoryStream();

    GZipStream gzip = new GZipStream(output, CompressionMode.Compress, true);
    gzip.Write(data, 0, data.Length);
    gzip.Close();

    return output.ToArray();
}

public static byte[] Decompress(byte[] data)
{
    MemoryStream input = new MemoryStream();
    input.Write(data, 0, data.Length);
    input.Position = 0;

    GZipStream gzip = new GZipStream(input, CompressionMode.Decompress, true);

    MemoryStream output = new MemoryStream();

    byte[] buff = new byte[64];
    int read = -1;

    read = gzip.Read(buff, 0, buff.Length);

    while (read > 0)
    {
        output.Write(buff, 0, read);
        read = gzip.Read(buff, 0, buff.Length);
    }

    gzip.Close();

    return output.ToArray();
}
Respondida el 05/08/2008 a las 13:04
fuente por usuario

votos
21

Siempre he usado la biblioteca SharpZip.

Aquí hay un enlace

Respondida el 01/08/2008 a las 18:30
fuente por usuario

votos
10

A partir de .Net 1.1, el único método disponible es llegar a las bibliotecas de Java.
Usar las clases Zip en las bibliotecas de la clase J # para comprimir archivos y datos con C #
No estoy seguro de si esto ha cambiado en versiones recientes.

Respondida el 01/08/2008 a las 18:28
fuente por usuario

votos
8

Mi respuesta sería cerrar los ojos y optar por DotNetZip . Ha sido probado por una comunidad grande.

Respondida el 17/11/2013 a las 17:08
fuente por usuario

votos
8

Puede utilizar una biblioteca de terceros como SharpZip como señaló Tom.

Otra forma (sin recurrir a terceros) es utilizar la API de Windows Shell. Tendrá que establecer una referencia a la biblioteca COM de automatización y controles de Shell de Microsoft en su proyecto C #. Gerald Gibson tiene un ejemplo en:

http://geraldgibson.net/dnn/Home/CZipFileCompression/tabid/148/Default.aspx

Copia de la página muerta de Internet Archive

Respondida el 01/08/2008 a las 19:04
fuente por usuario

votos
6

GZipStream es una muy buena utilidad de usar.

Respondida el 13/05/2012 a las 03:01
fuente por usuario

votos
6

Esto es muy fácil de hacer en Java, y como se indicó anteriormente, puede acceder a las bibliotecas java.util.zip desde C #. Para referencias ver:

código de ejemplo java.util.zip javadocs

Utilicé esto hace un tiempo para hacer un archivo zip profundo (recursivo) de una estructura de carpetas, pero no creo que haya usado alguna vez la descompresión. Si estoy tan motivado, puedo sacar ese código y editarlo aquí más tarde.

Respondida el 05/08/2008 a las 00:52
fuente por usuario

votos
5

Otra buena alternativa es también DotNetZip .

Respondida el 08/12/2011 a las 23:29
fuente por usuario

votos
0

se puede crear el archivo zip con este método:

public async Task<string> CreateZipFile(string sourceDirectoryPath, string name)
    {
        var path = HostingEnvironment.MapPath(TempPath) + name;
        await Task.Run(() =>
        {
            if (File.Exists(path)) File.Delete(path);
            ZipFile.CreateFromDirectory(sourceDirectoryPath, path);
        });
        return path;
    }

y luego se puede descomprimir el archivo zip con estos métodos:
1- que este método funcione con la ruta del archivo zip

public async Task ExtractZipFile(string filePath, string destinationDirectoryName)
    {
        await Task.Run(() =>
        {
            var archive = ZipFile.Open(filePath, ZipArchiveMode.Read);
            foreach (var entry in archive.Entries)
            {
                entry.ExtractToFile(Path.Combine(destinationDirectoryName, entry.FullName), true);
            }
            archive.Dispose();
        });
    }

2- este método de trabajo con el flujo de archivos zip

public async Task ExtractZipFile(Stream zipFile, string destinationDirectoryName)
    {
        string filePath = HostingEnvironment.MapPath(TempPath) + Utility.GetRandomNumber(1, int.MaxValue);
        using (FileStream output = new FileStream(filePath, FileMode.Create))
        {
            await zipFile.CopyToAsync(output);
        }
        await Task.Run(() => ZipFile.ExtractToDirectory(filePath, destinationDirectoryName));
        await Task.Run(() => File.Delete(filePath));
    }
Respondida el 09/01/2018 a las 15:35
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more