Pregunta

¿Alguien sabe de una buena manera para comprimir o descomprimir archivos y carpetas en C# rápidamente?Manejo de archivos de gran tamaño puede ser necesario.

No hay solución correcta

Otros consejos

El .Net 2.0 framework de espacio de nombres System.IO.Compression soporta algoritmos GZip y Deflate.Aquí hay dos métodos que se utilizan para comprimir y descomprimir un flujo de bytes que puede obtener de su objeto de archivo.Usted puede sustitución GZipStream para DefaultStream en los métodos que se indican a continuación para utilizar el algoritmo.Esto deja el problema de manejo de archivos comprimidos con los diferentes algoritmos de aunque.

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();
}

Yo siempre he usado el SharpZip de la Biblioteca.

He aquí un enlace

Como de .Net 1.1 el único método disponible es llegar en las bibliotecas de java.
El uso de la Postal de Clases en la J# Bibliotecas de clases para Comprimir Archivos y Datos con C#
No estoy seguro si esto ha cambiado en las últimas versiones.

Usted puede utilizar un 3ra parte de la biblioteca, tales como SharpZip como Tom señaló.

De otra manera (sin ir 3ª parte) es usar el Shell de Windows API.Usted necesitará establecer una referencia a la Shell de Microsoft Controles y Automatización de la biblioteca COM en el proyecto de C#.Gerald Gibson tiene un ejemplo en:

Internet Archive copia de los muertos de la página

Mi respuesta sería cerrar los ojos y optar por DotNetZip.Se ha probado por una gran comunidad.

GZipStream es una muy buena herramienta a utilizar.

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

java.util.zip javadocs
código de ejemplo

He utilizado este hace un tiempo para hacer una profunda (recursivo) zip de una estructura de carpetas, pero no creo que he utilizado la descompresión.Si estoy tan motivada que me puede sacar ese código y modificarlo en aquí más tarde.

Otra buena alternativa es también DotNetZip.

puede crear archivos 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, a continuación, puede descomprimir el archivo zip con este método:
1 - este método de trabajo con cremallera ruta de acceso del archivo

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 archivo zip de flujo

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));
    }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top