Frage

Ich weiß, es gibt Bibliotheken gibt für mit ZIP-Dateien arbeiten . Und können Sie alternativ die Funktionalität in Windows integriert verwenden für die Bearbeitung von ZIP-Dateien .

Aber, ich bin gefragt, ob jemand gearbeitet hat, wie die Werkzeuge in die System.IO.Compression Namespace für das Lesen in .NET gebaut verwenden / Schreiben von ZIP-Dateien? Oder ist es nicht nur möglich, diese Namespace?

AKTUALISIERT: Ich habe jemanden Kommentar scheint, dass die System.IO.Packaging Namespace mit diesem auch sehr nützlich sein könnte. Hat jemand genau wissen, wie es zu tun?

War es hilfreich?

Lösung

MSDN hat eine komplette Beispiel < a href = "http://msdn.microsoft.com/en-us/library/system.io.packaging.zippackage.aspx" rel = "noreferrer"> http://msdn.microsoft.com/en-us/ Bibliothek / system.io.packaging.zippackage.aspx die ZipPackage Klasse. Erfordert .NET 3.5.

Andere Tipps

Dave, sehr schön !! Ich wusste nicht, dass da drin war.

Nun, da ich weiß, was zu suchen, konnte ich einen Artikel mit einem kleinen Codebeispiel finden, wie man es verwenden: http://weblogs.asp.net/jgalloway/archive/2007/10/25/creating-zip-archives-in-net-without-an-external-library-like-sharpziplib.aspx

über einen entsprechenden Hinweis fand ich auch das DotNetZip Projekt , die extrem einfach zu bedienen aussieht.

Sie wollen eine Drittanbieter-Bibliothek verwenden, wie http://www.codeplex.com/DotNetZip , anstatt zu versuchen, GZipStream oder DeflateStream zu verwenden, um eine Zip-Datei zu lesen.

Die *** Stream-Klassen in .NET können Sie komprimierte Ströme von Bytes lesen oder schreiben. Diese Klassen NICHT lesen oder ZIP-Dateien schreiben. Die Zip-Datei werden Daten von „einem Umschlag“ oder einem Kopf umgeben komprimiert. Betrachten Sie es als Metadaten - den Namen der Datei enthält, Zeitstempel, CRC, und ein paar andere Sachen. Die ** Stream-Klassen erzeugen nur den Strom der komprimierten Daten, und wissen nicht, wie die Metadaten zu erzeugen oder verbrauchen, die im PKZip Formatspezifikation von PKWare beibehalten beschrieben.

Third-Party-Bibliotheken wie DotNetZip die Metadaten in einem ZIP-Archiv behandeln. Sie können oder auch nicht verwenden, um die System.IO.Compression.DeflateStream () Klasse erzeugt die komprimierten Strom von Bytes. In früheren Versionen zum Beispiel verwendete DotNetZip das eingebaute in DeflateStream. Ab v1.7 enthält DotNetZip seine eigene DeflateStream, die effizienter als die in .NET Framework ausgeliefert ist. Als zusätzlicher Vorteil ermöglicht die eingebettete DeflateStream in DotNetZip DotNetZip 2.0 auf dem .NET Compact Framework verwendet werden, die eine System.IO.Compression.DeflateStream fehlt. (Es wurde hinzugefügt, in Compact Framework 3.5)

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

Da .NET 4.5 hat Microsoft die ZipArchive Klasse zum System.IO.Compression Namespace. Im Gegensatz zu anderen Klassen in diesem Namespace, obwohl, wie GZipStream und Deflate Strom, die ZipArchive erfordert einen Verweis auf die System.IO.Compression.dll Montag.

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

Darüber hinaus hat Microsoft die Microsoft Compression NuGet Paket erstellt, die hinzufügt Unterstützung für ZipArchive und verwandten Klassen zu Windows Phone 8 und anderen tragbaren Klassenbibliotheken

Ein älterer Thread, ich weiß, aber ich möchte darauf hinweisen, dass .NET 4.5 umfangreiche Verbesserungen System.IO.Compression hinzugefügt. Es kann nun Dateien manipuliert .zip ganz gut, auch nach unten einzelnen Dateien im ZIP-Archiv zum Belichten als Strom fähig oder lesen und schreiben, ohne den Schritt zum Extrahieren und Komprimieren der Dateien.

Ja, ich habe es in der Vergangenheit verwendet. I Unter eingestuft DataSet einmal zu unterstützen selbst persistierenden in eine Datei (über das ReadXML / WriteXML Methode). Als zusätzlichen Bonus, habe ich beschlossen, es zu erlauben, zu sein, optional komprimiert, falls gewünscht (das, wie Sie alle bereits wissen sollten, mit Textdaten wie XML äußerst wirksam ist).

habe ich die GZipStream Klasse (es war mein Verständnis zu der Zeit, dass die entsprechenden DeflateStream war lediglich GZIP ohne Header-Informationen, oder so - ich bin sicher, dass jemand mich auf diese korrigieren könnte). Es funktioniert ganz einfach durch Huckepack auf einem anderen Strom und damit dann Sie die GZipStream an seiner Stelle verwendet werden. In meinem Fall war es huckepack auf einem Filestream.

Bei einer Memory werden gefüllt mit die Ausgabe von myDataSet.WriteXML(), ich habe so etwas wie die folgenden:

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);
}
    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);
        }
    }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top