Pregunta

Sé que hay bibliotecas disponibles para trabajar con archivos ZIP . Y, alternativamente, puede usar la funcionalidad integrada en Windows para trabajar archivos ZIP .

Pero, me pregunto si alguien ha resuelto cómo usar las herramientas integradas en el espacio de nombres System.IO.Compression dentro de .NET para leer / escribir archivos ZIP. O, ¿no es posible usar solo este espacio de nombres?

ACTUALIZADO: Parece que alguien comenta que el espacio de nombres System.IO.Packaging también podría ser útil con esto. ¿Alguien sabe exactamente cómo hacerlo?

¿Fue útil?

Solución

MSDN tiene un ejemplo http://msdn.microsoft.com/en-us/ library / system.io.packaging.zippackage.aspx utilizando la clase ZipPackage. Requiere .NET 3.5.

Otros consejos

Dave, muy lindo !! No sabía que estaba allí.

Ahora que sé qué buscar, pude encontrar un artículo con un pequeño ejemplo de código sobre cómo usarlo: http://weblogs.asp.net/jgalloway/archive/2007/10/25/creating-zip-archives-in-net-without-an-external-library-like-sharpziplib.aspx

En una nota relacionada, también encontré el proyecto DotNetZip que parece extremadamente fácil de usar.

Deberá utilizar una biblioteca de terceros, como http://www.codeplex.com/DotNetZip , en lugar de intentar usar GZipStream o DeflateStream para leer un archivo zip.

Las clases *** Stream en .NET pueden permitirle leer o escribir secuencias comprimidas de bytes. Estas clases NO leen ni escriben archivos zip. El archivo zip son datos comprimidos rodeados por " un sobre " o un encabezado Piense en ello como metadatos: incluye el nombre del archivo, la marca de tiempo, CRC y un montón de otras cosas. Las clases ** Stream solo producen el flujo de datos comprimidos y no saben cómo producir o consumir los metadatos, que se describe en la especificación de formato PKZip mantenida por PKWare.

Las bibliotecas de terceros como DotNetZip manejan los metadatos en un archivo ZIP. Pueden o no usar la clase System.IO.Compression.DeflateStream () para producir el flujo comprimido de bytes. En versiones anteriores, por ejemplo, DotNetZip utilizaba el DeflateStream incorporado. A partir de v1.7, DotNetZip incluye su propio DeflateStream, que es más eficiente que el que se incluye en .NET Framework. Como beneficio adicional, el DeflateStream incorporado en DotNetZip permite que DotNetZip se use en .NET Compact Framework 2.0, que carece de un System.IO.Compression.DeflateStream. (se agregó en Compact Framework 3.5)

Hay un buen foro en el sitio DotNetZip si tiene más preguntas. Ejemplo de código C #:

    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, Microsoft ha ofrecido el clase ZipArchive en el espacio de nombres System.IO.Compression . Sin embargo, a diferencia de otras clases en ese espacio de nombres, como GZipStream y Deflate , el ZipArchive requiere una referencia al System.IO. Compression.dll ensamblado.

Es bastante simple de usar, y el enlace de arriba a MSDN proporciona algunos buenos ejemplos.

Además, Microsoft ha creado el paquete Microsoft Compression NuGet , que agrega compatibilidad con ZipArchive y clases relacionadas con Windows Phone 8 y otras bibliotecas de clases portátiles

Un hilo antiguo, lo sé, pero me gustaría señalar que .NET 4.5 agregó mejoras extensas a system.io.compression. Ahora puede manipular archivos .zip bastante bien, incluso exponiendo archivos individuales dentro del zip como transmisiones capaces de leer o escribir sin el paso de extraer y comprimir los archivos.

Sí, lo he usado en el pasado. Subclasifiqué DataSet una vez para admitir la persistencia a un archivo (a través de ReadXML / método WriteXML ). Como una ventaja adicional, decidí permitir que se comprimiera, opcionalmente, si lo desea (esto, como todos deberían saber, es extremadamente efectivo con datos textuales como XML).

Utilicé la clase GZipStream (En ese momento entendí que el DeflateStream relacionado era simplemente GZip sin información de encabezado, o algo así; estoy seguro de que alguien podría corregirme al respecto). Funciona de manera bastante simple haciendo una copia de seguridad en la parte superior de otra secuencia y, por lo tanto, usa el GZipStream en su lugar. En mi caso, fue un respaldo en un FileStream.

Dado un MemoryStream para rellenar la salida de myDataSet.WriteXML () , hice algo como lo siguiente:

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

Donde Save () y Pump () son métodos simples como los siguientes:

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