Domanda

So che ci sono librerie là fuori per lavorare con i file ZIP . In alternativa, puoi utilizzare la funzionalità integrata in Windows per lavorare file ZIP .

Ma mi chiedo se qualcuno ha capito come usare gli strumenti integrati nello spazio dei nomi System.IO.Compression in .NET per leggere / scrivere file ZIP? Oppure non è possibile utilizzare solo questo spazio dei nomi?

AGGIORNATO: Sembra che qualcuno abbia commentato che lo spazio dei nomi System.IO.Packaging potrebbe essere utile anche con questo. Qualcuno sa esattamente come farlo?

È stato utile?

Soluzione

MSDN ha un esempio < a href = "http://msdn.microsoft.com/en-us/library/system.io.packaging.zippackage.aspx" rel = "noreferrer"> http://msdn.microsoft.com/en-us/ library / system.io.packaging.zippackage.aspx usando la classe ZipPackage. Richiede .NET 3.5.

Altri suggerimenti

Dave, molto carino !! Non sapevo che fosse lì.

Ora che so cosa cercare, sono stato in grado di trovare un articolo con un piccolo esempio di codice su come usarlo: http://weblogs.asp.net/jgalloway/archive/2007/10/25/creating-zip-archives-in-net-without-an-external-library-like-sharpziplib.aspx

In una nota correlata, ho anche trovato il progetto DotNetZip che sembra estremamente facile da usare.

Ti consigliamo di utilizzare una libreria di terze parti, come http://www.codeplex.com/DotNetZip , anziché tentare di utilizzare GZipStream o DeflateStream per leggere un file zip.

Le classi *** Stream in .NET possono consentire di leggere o scrivere flussi compressi di byte. Queste classi NON leggono o scrivono file zip. Il file zip è un dato compresso circondato da "una busta" o un'intestazione. Pensalo come metadata: include il nome del file, il timestamp, il CRC e un sacco di altre cose. Le classi ** Stream producono solo il flusso di dati compressi e non sanno come produrre o utilizzare i metadati, che è descritto nella specifica del formato PKZip gestita da PKWare.

Le librerie di terze parti come DotNetZip gestiscono i metadati in un archivio ZIP. Possono o meno utilizzare la classe System.IO.Compression.DeflateStream () per produrre il flusso compresso di byte. Nelle versioni precedenti, ad esempio, DotNetZip utilizzava DeflateStream integrato. A partire dalla v1.7, DotNetZip include il proprio DeflateStream che è più efficiente di quello fornito in .NET Framework. Come ulteriore vantaggio, DeflateStream incorporato in DotNetZip consente di utilizzare DotNetZip su .NET Compact Framework 2.0, privo di System.IO.Compression.DeflateStream. (è stato aggiunto in Compact Framework 3.5)

C'è un buon forum sul sito DotNetZip se hai altre domande. Esempio di codice 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);
    }

Da .NET 4.5, Microsoft offre il ZipArchive nello spazio dei nomi System.IO.Compression . A differenza di altre classi in quello spazio dei nomi, tuttavia, come GZipStream e Deflate , lo ZipArchive richiede un riferimento a System.IO. Compression.dll assembly.

È abbastanza semplice da usare e il link sopra a MSDN fornisce alcuni buoni esempi.

Inoltre, Microsoft ha creato il pacchetto NuGet Microsoft Compression , che aggiunge supporto per ZipArchive e relative classi per Windows Phone 8 e altre librerie di classi portatili

Un thread più vecchio, lo so, ma vorrei sottolineare che .NET 4.5 ha aggiunto ampi miglioramenti a system.io.compression. Ora può manipolare abbastanza bene i file .zip, anche esponendo i singoli file all'interno dello zip come flussi in grado di leggere o scrivere e scrivere senza la fase di estrazione e compressione dei file.

Sì, l'ho usato in passato. Ho sottoclassato DataSet una volta per supportare il persistere in un file (tramite ReadXML / metodo WriteXML ). Come bonus aggiuntivo, ho deciso di consentire, se lo si desidera, di essere compresso (questo, come tutti già sapete, è estremamente efficace con dati testuali come XML).

Ho usato la GZipStream (era mia comprensione al momento che il DeflateStream era semplicemente GZip senza informazioni di intestazione, o qualcosa del genere - Sono sicuro che qualcuno potrebbe correggermi su questo). Funziona abbastanza semplicemente appoggiandosi su un altro stream e quindi si utilizza GZipStream al suo posto. Nel mio caso, è stato appoggiato su un FileStream.

Dato un MemoryStream da riempire con l'output di myDataSet.WriteXML () , ho fatto qualcosa del tipo:

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

Dove Save () e Pump () sono metodi semplici come i seguenti:

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);
        }
    }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top