Compactação / descompactação de pastas e arquivos

votos
42

Alguém sabe de uma boa maneira de compactar ou descompactar arquivos e pastas em C # rapidamente? Manuseio de grandes arquivos podem ser necessários.

Publicado 01/08/2008 em 18:13
fonte usuário
Em outras línguas...                            


9 respostas

votos
24

O quadro namespace Net 2.0 System.IO.Compressionsuporta GZip e desinflar algoritmos. Aqui estão dois métodos que comprimir e descomprimir um fluxo de bytes, que você pode obter a partir de seu objeto de arquivo. Você pode subsitute GZipStreampara DefaultStreamnos métodos abaixo para usar esse algoritmo. Isso ainda deixa o problema de lidar com arquivos compactados com diferentes algoritmos embora.

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();
}
Respondeu 05/08/2008 em 13:04
fonte usuário

votos
21

Eu sempre usei a Biblioteca SharpZip.

Aqui está um link

Respondeu 01/08/2008 em 18:30
fonte usuário

votos
10

A partir de .Net 1.1 o único método disponível está chegando para as bibliotecas Java.
Usando as classes zip na J # bibliotecas de classe para compactar arquivos e dados com C #
Não sei se isso mudou nas versões recentes.

Respondeu 01/08/2008 em 18:28
fonte usuário

votos
8

Minha resposta seria fechar os olhos e optar por DotNetZip . Tem sido testado por uma grande comunidade.

Respondeu 17/11/2013 em 17:08
fonte usuário

votos
8

Você pode usar uma biblioteca de 3-parte, como SharpZip como Tom apontou.

Outra maneira (sem passar 3-party) é usar a API do Windows Shell. Você precisará definir uma referência para os controles Microsoft Shell e biblioteca de Automação COM em seu projeto C #. Gerald Gibson tem um exemplo em:

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

cópia do Internet Archive da página mortos

Respondeu 01/08/2008 em 19:04
fonte usuário

votos
6

GZipStream é realmente um bom utilitário para usar.

Respondeu 13/05/2012 em 03:01
fonte usuário

votos
6

Isto é muito fácil de fazer em java, e como dito acima, pode chegar às bibliotecas java.util.zip de C #. Para referências ver:

java.util.zip javadocs
código amostra

Eu usei isso há um tempo atrás para fazer um zip profunda (recursiva) de uma estrutura de pastas, mas eu não acho que eu nunca usei a descompactação. Se eu estou tão motivado eu possa puxar o código para fora e editá-lo para aqui mais tarde.

Respondeu 05/08/2008 em 00:52
fonte usuário

votos
5

Outra boa alternativa é também DotNetZip .

Respondeu 08/12/2011 em 23:29
fonte usuário

votos
0

você pode criar o arquivo zip com 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;
    }

e então você pode descompactar o arquivo zip com estes métodos:
1- este trabalho método com o caminho do arquivo 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();
        });
    }

trabalho 2 este método com fluxo de arquivo 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));
    }
Respondeu 09/01/2018 em 18:35
fonte usuário

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