Aquí podría ser tu PUBLICIDAD


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 DylanJ
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 01:04
fuente por usuario Dave Anderson


Aquí podría ser tu PUBLICIDAD


votos
21

Siempre he usado la biblioteca SharpZip.

Aquí hay un enlace

Respondida el 01/08/2008 a las 06:30
fuente por usuario Tom Grochowicz

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 06:28
fuente por usuario alumb

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 05:08
fuente por usuario Amit Joki

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 07:04
fuente por usuario user2189331

votos
6

GZipStream es una muy buena utilidad de usar.

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

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 12:52
fuente por usuario shsteimer

votos
5

Otra buena alternativa es también DotNetZip .

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

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 03:35
fuente por usuario mohsen_1687