Pergunta

Eu sei que há lá fora para trabalhar com arquivos zip . E, você pode alternativamente usar a funcionalidade embutida no Windows para trabalhar ZIP arquivos .

Mas, eu estou querendo saber se alguém tem funcionado como usar as ferramentas incorporadas ao namespace System.IO.Compression dentro .NET para leitura / escrita ZIP arquivos? Ou, não é possível usando apenas este namespace?

ATUALIZADO: Eu tenho parecem alguém comentário que o namespace System.IO.Packaging pode ser útil com isso também. Alguém sabe exatamente como fazê-lo?

Foi útil?

Solução

MSDN tem uma completa href="http://msdn.microsoft.com/en-us/library/system.io.packaging.zippackage.aspx" < a href = "http://msdn.microsoft.com/en-us/library/system.io.packaging.zippackage.aspx" rel = "noreferrer"> http://msdn.microsoft.com/en-us/ biblioteca / system.io.packaging.zippackage.aspx usando a classe ZipPackage. Requer .NET 3.5.

Outras dicas

Dave, muito bom !! Eu não sabia o que estava lá dentro.

Agora que eu sei o que procurar, eu era capaz de encontrar um artigo com uma amostra de código pequeno em como usá-lo: http://weblogs.asp.net/jgalloway/archive/2007/10/25/creating-zip-archives-in-net-without-an-external-library-like-sharpziplib.aspx

Em uma nota relacionada, eu também encontrei o DotNetZip projeto que parece extremamente fácil de usar.

Você vai querer usar uma biblioteca de terceiros, como http://www.codeplex.com/DotNetZip , ao invés de tentar usar GZipStream ou DeflateStream para ler um arquivo zip.

Os *** classes de fluxo em .NET pode deixá-lo ler ou fluxos de gravação comprimido de bytes. Essas classes NÃO ler ou escrever arquivos zip. O arquivo zip é comprimido dados cercados por "um envelope" ou um cabeçalho. Pense nisso como metadados - que inclui o nome do arquivo, timestamp, CRC, e um monte de outras coisas. As classes sequência ** produzir apenas o fluxo de dados comprimidos, e não sabe como produzir ou consumir os metadados, que é descrito na especificação do formato PKZip mantido por PKWare.

bibliotecas de terceiros como DotNetZip lidar com os metadados em um arquivo ZIP. Eles podem ou não podem utilizar a classe System.IO.Compression.DeflateStream () para o fluxo produzido comprimido de bytes. Em versões anteriores, por exemplo, DotNetZip utilizado o embutido DeflateStream. A partir de v1.7, DotNetZip inclui seu próprio DeflateStream que é mais eficiente do que aquele fornecido no .NET Framework. Como um benefício adicional, o DeflateStream incorporado em DotNetZip permite DotNetZip para ser utilizado no Compact Framework 2.0, que carece de uma System.IO.Compression.DeflateStream. (Que foi adicionada no compacto Quadro 3.5)

Há um fórum bom no site da DotNetZip se você tiver mais perguntas. Exemplo C # código:

    try
    {
        using (ZipFile zip = new ZipFile())
        {
            zip.AddDirectory(DirectoryToZip); // recurses subdirs
            zip.Save(Filename);
        }
    }
    catch (System.Exception ex1)
    {
        System.Console.Error.WriteLine("exception: " + ex1);
    }

Desde .NET 4.5, a Microsoft ofereceu o ZipArchive classe para o namespace System.IO.Compression. Ao contrário de outras classes em que namespace, porém, como GZipStream e fluxo Deflate, o ZipArchive requer uma referência para o System.IO.Compression.dll montagem.

É bastante simples de usar, e o link acima para MSDN fornece alguns exemplos bons.

Além disso, a Microsoft criou o Microsoft Compression NuGet pacote, que adiciona suporte para as classes ZipArchive e relacionados para o Windows Phone 8 e outro portátil bibliotecas de classe

Um fio mais velho, eu sei, mas eu gostaria de salientar que .NET 4.5 adicionado extensas melhorias para System.IO.Compression. Ele agora pode manipular arquivos .zip muito bem, mesmo para baixo para expor os arquivos individuais dentro do zip como córregos capaz ou ler e escrever sem a etapa de extrair e comprimir os arquivos.

Sim, eu usei no passado. I subclasse DataSet uma vez para apoio persistindo em si para um arquivo (por meio do ReadXML / WriteXML método). Como um bônus adicional, decidi permitir que ele seja, opcionalmente, comprimido se desejado (isto, como todos vocês já devem saber, é extremamente eficaz com dados textuais como XML).

Eu usei o href="http://msdn.microsoft.com/en-us/library/system.io.compression.gzipstream.aspx" rel="nofollow noreferrer"> GZipStream classe (era o meu entendimento no momento em que o relacionado DeflateStream era meramente GZip sem informações de cabeçalho, ou algo assim - eu tenho certeza que alguém poderia me corrigir sobre isso). Ele funciona muito simplesmente piggy-backing em cima de outro córrego e, assim, você, em seguida, usar o GZipStream em seu lugar. No meu caso, foi piggy-backing em um FileStream.

Dado um MemoryStream para ser preenchido com a saída do myDataSet.WriteXML(), eu fiz algo parecido com o seguinte:

if (CompressData)
{
    // Write to memory
    mStream = new MemoryStream();
    Save(mStream);
    mStream.Seek(0, SeekOrigin.Begin);

    // Filter that through a GZipStream and then to file
    fStream = new FileStream(Path.Combine(CacheFilePath, FileName + ".gz"),
                             FileMode.OpenOrCreate);
    zipStream = new GZipStream(fStream, CompressionMode.Compress, true);

    Pump(mStream, zipStream);
}
else
{
    // Write straight to file
    fStream = new FileStream(Path.Combine(CacheFilePath, FileName),
                             FileMode.OpenOrCreate);
    Save(fStream);
}

Onde Save() e Pump() são métodos simples como o seguinte:

private void Pump(Stream input, Stream output)
{
    int n;
    byte[] bytes = new byte[4096]; // 4KiB at a time

    while ((n = input.Read(bytes, 0, bytes.Length)) != 0)
    {
        output.Write(bytes, 0, n);
    }
}

public void Save(Stream stream)
{
    AcceptChanges();

    WriteXml(stream, XmlWriteMode.WriteSchema);
}
    public static void zIpDatabseFile(string srcPath, string destPath)
    {//This is for  Zip a File
        using (var source = new FileStream(srcPath, FileMode.Open, FileAccess.Read, FileShare.Read))
        using (var dest = new FileStream(destPath, FileMode.OpenOrCreate, FileAccess.Write))
        using (var zip = new GZipStream(dest, CompressionMode.Compress))
        {
            source.CopyTo(zip);
        }
    }
    public static void uNzIpDatabaseFile(string SrcPath, string DestPath)
    {// This is for unzip a files.
        using (var source = new FileStream(SrcPath, FileMode.Open, FileAccess.Read, FileShare.Read))
        using (var dest = new FileStream(DestPath, FileMode.OpenOrCreate, FileAccess.Write))
        using (var zip = new GZipStream(source, CompressionMode.Decompress))
        {
            zip.CopyTo(dest);
        }
    }
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top