2008-10-08 5 views
19

Ich weiß, dass es libraries out there for working with ZIP files gibt. Und Sie können alternativ use the functionality built into Windows for working ZIP files.Wie kann man mit System.IO.Compression ZIP-Dateien lesen/schreiben?

Aber ich frage mich, ob jemand ausgearbeitet hat, wie man die in den Namespace System.IO.Compression in .NET integrierten Tools zum Lesen/Schreiben von ZIP-Dateien verwendet? Oder ist es nicht möglich, nur diesen Namespace zu verwenden?

AKTUALISIERT: Ich habe jemanden kommentiert, dass der Namespace System.IO.Packaging auch mit diesem nützlich sein könnte. Weiß jemand genau wie es geht?

Antwort

15

MSDN verfügt über eine vollständige examplehttp://msdn.microsoft.com/en-us/library/system.io.packaging.zippackage.aspx mithilfe der ZipPackage-Klasse. Benötigt .NET 3.5.

+5

Tatsächlich enthält der 'System.IO.Packaging'-Namespace Klassen für die Arbeit mit Open Package Style-Paketen. Sie können es verwenden, um ZIP-Dateien zu erstellen (wenn Sie sich nicht um einige zusätzliche Dateien kümmern, die in Ihrem ZIP enthalten sein werden), aber es kann nicht verwendet werden, um * any * zip-Dateien zu öffnen. Weitere Informationen finden Sie in der [ZipPackage-Klassendokumentation] (http://msdn.microsoft.com/en-us/library/system.io.packaging.zippackage (v = V.85) .aspx). Diese Community ist dies nicht vorhanden in .NET 4.0 doc, ist aber immer noch gültig). – larsmoa

0

Ja, ich habe es in der Vergangenheit verwendet. Ich unterordnete DataSet einmal, um zu unterstützen, sich in einer Datei (über die ReadXML/WriteXML-Methode) zu persistieren. Als zusätzlichen Bonus habe ich beschlossen, dass es optional komprimiert werden kann (dies ist, wie Sie alle bereits wissen sollten, extrem effektiv mit Textdaten wie XML).

Ich benutzen das GZipStream Klasse (es mein Verständnis zu der Zeit, die im Zusammenhang DeflateStream lediglich GZIP ohne Header-Informationen waren war, oder so — Ich bin sicher, dass jemand mich auf diese korrigieren könnte). Es funktioniert ganz einfach, indem du auf einen anderen Stream schwingst und du dann den GZipStream an seiner Stelle verwendest. In meinem Fall war es ein Piggy-Backing auf einem FileStream.

ein MemoryStream gefüllt werden mit dem Ausgang des myDataSet.WriteXML() Given, ich so etwas wie die folgenden haben:

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

Wo Save() und Pump() sind einfache Methoden wie folgt aus:

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

Ihre Lösung liest oder schreibt nicht in das ZIP-Dateiformat, sondern einfach in die rohe deflate-Komprimierung oder GZip simple header-footer extension um die Deflate-Komprimierung herum. –

+0

+1 Ihre Antwort erstellt möglicherweise keine ZIP-Dateien, zeigt aber, wie System.IO.Compression verwendet wird. Dies ist ideal zum Komprimieren von Dateien in SSIS, wo Sie auf .NET 2.0 beschränkt sind und externe Bibliotheken nur schwer zu verwenden sind. – bstoney

6

Sie werden Sie möchten eine Bibliothek eines Drittanbieters wie http://www.codeplex.com/DotNetZip verwenden, anstatt zu versuchen, GZipStream oder DeflateStream zum Lesen einer Zip-Datei zu verwenden.

Mit den *** Stream-Klassen in .NET können Sie komprimierte Byteströme lesen oder schreiben. Diese Klassen lesen oder schreiben keine ZIP-Dateien. Die Zip-Datei ist komprimierte Daten, die von einem "Umschlag" oder einer Kopfzeile umgeben sind. Betrachten Sie es als Metadaten - es enthält den Namen der Datei, Zeitstempel, CRC und eine Menge anderer Sachen. Die ** Stream-Klassen erzeugen nur den Strom komprimierter Daten und wissen nicht, wie sie die Metadaten erzeugen oder konsumieren sollen, die in der von PKWare gepflegten PKZip-Formatspezifikation beschrieben sind.

Drittanbieterbibliotheken wie DotNetZip verarbeiten die Metadaten in einem ZIP-Archiv. Sie können die System.IO.Compression.DeflateStream() - Klasse verwenden oder nicht, um den komprimierten Bytestrom zu erzeugen. In früheren Versionen verwendete DotNetZip beispielsweise den integrierten DeflateStream. Ab v1.7 enthält DotNetZip einen eigenen DeflateStream, der effizienter ist als der, der in .NET Framework ausgeliefert wird. Als zusätzlichen Vorteil ermöglicht der eingebettete DeflateStream in DotNetZip die Verwendung von DotNetZip auf dem .NET Compact Framework 2.0, dem ein System.IO.Compression.DeflateStream fehlt. (Es wurde in Compact Framework 3.5 hinzugefügt)

Es gibt ein gutes Forum auf der DotNetZip-Website, wenn Sie weitere Fragen haben. Beispiel C# -Code:

try 
    { 
     using (ZipFile zip = new ZipFile()) 
     { 
      zip.AddDirectory(DirectoryToZip); // recurses subdirs 
      zip.Save(Filename); 
     } 
    } 
    catch (System.Exception ex1) 
    { 
     System.Console.Error.WriteLine("exception: " + ex1); 
    } 
0
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); 
     } 
    } 
5

Seit .NET 4.5 hat Microsoft die ZipArchive Klasse zum System.IO.Compression Namespace angeboten. Im Gegensatz zu anderen Klassen in diesem Namespace, wie GZipStream und Deflate Strom, benötigt die ZipArchiveeinen Verweis auf die System.IO.Compression.dll Assembly.

Es ist ziemlich einfach zu bedienen, und der Link oben zu MSDN bietet einige gute Beispiele.

Darüber hinaus hat Microsoft die Microsoft Compression NuGet package erstellt, die auf Windows Phone für ZipArchive und verwandte Klassen Unterstützung ergänzt 8 und andere tragbare Klassenbibliotheken

3

Ein älterer Thread, ich weiß, aber ich möchte darauf hinweisen, dass. NET 4.5 hat umfangreiche Verbesserungen an system.io.compression hinzugefügt. Es kann nun .zip-Dateien sehr gut manipulieren, sogar bis einzelne Dateien innerhalb der ZIP als Streams verfügbar sind oder lesen und schreiben, ohne dass die Dateien extrahiert und komprimiert werden müssen.

Verwandte Themen