codestory

Kompression und Dekompression in C#

  1. Das hierarchische Diagramm der Klasse
  2. ZipFile
  3. ZipArchive
  4. Der Anhang: den Fehler überwinden

1. Das hierarchische Diagramm der Klasse

Folgend ist die Liste der Klasse zur Komprimierung und Dekomprimierung der File. Sie liegen in der namespace System.IO.Compression.
Die Klasse
Die Bezeichnung
ZipFile
Die static Methode zu der Erstellung und dem Ausschnitt der Daten und der Öffnung der zip File versorgen.
ZipArchive
Die Kollektion von File vertreten, die in einer ZIP File komprimiert werden
ZipArchiveEntry
Die Datei in der ZIP File vertreten
DeflateStream
Die Methode und die Attribute für den Stream bieten. Durch den Algorithm Deflate komprimieren und diskomprimieren.
GZipStream
Die Methode und die Attribute bieten, die für die Diskomprimierung und Komprimierung des Stream benutzt werden
Beachten Sie: Diese Klasse wurden ab der Version 4.5 im C# eingeführt, Deshalb soll Ihr Projekt die Version 4.5 oder die neuere von .NET verwenden.

2. ZipFile

Die Klasse ZipFile ist eine Utility Klasse. Sie hat viele static Methode, damit Sie die File Zip öffnen und die Daten nehmen oder die üblichen Situation machen können wie die Komprimierung eines Ordner zur Zip File oder die Diskomprimierung einer Zip File zu einem Ordner ..
Das folgende einfache Beispiel benutzt die Utility-Methode der Klasse ZipFile um einen Ordner zu einer Zip File zu komprimieren und dann diese File zu einem Ordner zu diskomprimieren.
ZipDirectoryDemo.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO.Compression;

namespace CompressionTutorial
{
    class ZipDirectoryDemo
    {
        public static void Main(string[] args)
        {
            // Der Verzeichnis wird komprimiert werden
            string inputDir = "C:/test/inputdir";

            // Die Input-File nach der Komprimierung
            string zipPath = "C:/test/data.zip";

            // Die File zip in einem Verzeichnis diskomprimieren.
            string extractPath = "C:/test/outputdir";

            // Die File Zip durch die Verzeichniskomprimierung erstellen.
            ZipFile.CreateFromDirectory(inputDir, zipPath);

            // Die File Zip in einem Verzeichnis diskomprimieren
            ZipFile.ExtractToDirectory(zipPath, extractPath);

            Console.WriteLine("Done!");
        }
    } 
}
Wenn Sie eine Fehlermeldung bekommen: "The name 'ZipFile' does not exist in the current context"(trotz der Anmeldung using System.IO.Compression), d.h benutzt Ihr Projekt die Version vor 4.5 von .NET oder das Programm findet die Bibliothek DLL nicht. Sie können die Fehlerbehebung in das Verzeichnis in der Ende des Dokument sehen
Das Beispiel durchführen und das Ergebnis erhalten
  • data.zip

3. ZipArchive

ZipArchive vertretet eine in einer Zip File komprimierte Filegruppe. Sie können durch die Methode OpenRead von der Klasse ZipFile ein Objekt ZipArchive erstellen. Durch ZipArchive können Sie die in die Zip File komprimierten untergeordneten File lesen
Das folgende Beispiel listiert die ZipArchiveEntry in die Zip File
ListArchiveEntryDemo.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO.Compression;
using System.IO; 

namespace CompressionTutorial
{
    class ListArchiveEntryDemo
    { 
        public static void Main(string[] args)
        {
            string zipPath =  "c:/test/data.zip";  
            using (ZipArchive archive = ZipFile.OpenRead(zipPath))
            {
                // Die Liste von ZipArchiveEntry browsen.
                foreach (ZipArchiveEntry entry in archive.Entries)
                {
                    Console.WriteLine("Entry:");
                    Console.WriteLine("  Name = " + entry.Name);
                    Console.WriteLine("  FullName = " + entry.FullName);
                }
            } 
            Console.Read();
        }
    } 
}
Das Beispiel durchführen
Entry:
  Name = data.docx
  FullName = data.docx
Entry:
  Name = image.bmp
  FullName = image.bmp
Entry:
  Name = readme.txt
  FullName = readme.txt
Entry:
  Name = Dotnet.docx
  FullName = documents\Dotnet.docx
Entry:
  Name = java.docx
  FullName = documents\java.docx
Die Datenfile in der Zip FIle entnehmen
ExtractDemo.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO.Compression;
using System.IO;

namespace CompressionTutorial
{
    class ExtractDemo {
        static void Main(string[] args)
        {
            string zipPath = "c:/test/data.zip"; 
            // Der Outputsverzeichnis zur Diskomprimierung.
            string extractPath = "c:/test/extract";

            // Wenn der Verzeichnis existiert nicht, erstell ihn.
            if (!Directory.Exists(extractPath))
            {
                System.IO.Directory.CreateDirectory(extractPath);
            } 
            using (ZipArchive archive = ZipFile.OpenRead(zipPath))
            {
                foreach (ZipArchiveEntry entry in archive.Entries)
                {
                    Console.WriteLine("Found: " + entry.FullName); 
                    // Die Entry mit der Ende von .docx finden
                    if (entry.FullName.EndsWith(".docx", StringComparison.OrdinalIgnoreCase))
                    {
                        // Zum Beispiel: documents/Dotnet.docx
                        Console.WriteLine(" - Extract entry: " + entry.FullName);

                        // C:/test/extract/documents/Dotnet.docx  ...
                        string entryOuputPath = Path.Combine(extractPath, entry.FullName); 
                        Console.WriteLine(" - Entry Ouput Path: " + entryOuputPath);

                        FileInfo fileInfo = new FileInfo(entryOuputPath); 
                        // Guarantieren, dass der Verzeichnis der File existiert.
                        // Zum Beispiel: C:/test/extract/documents
                        fileInfo.Directory.Create();

                        // Die alte File überschreiben (overwrite) wenn sie existiert
                        entry.ExtractToFile(entryOuputPath,true);
                    }
                }
            } 
            Console.ReadLine();
        }
    } 
}
das Beispiel durchführen
Found: data.docx
 - Extract entry: data.docx
 - Entry Output Path: c:/test/extract\data.docx
Found: image.bmp
Found: readme.txt
Found: documents\Dotnet.docx
 - Extract entry: documents\Dotnet.docx
 - Entry Output Path: c:/test/extract\documents\Dotnet.docx
Found: documents\java.docx
 - Extract entry: documents\java.docx
 - Entry Output Path: c:/test/extract\documents\java.docx
Sie können die File in einer vorhandenen Zip FIle einfügen
AddEntryDemo.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO.Compression;
using System.IO;

namespace CompressionTutorial
{
    class AddEntryDemo
    {
        static void Main(string[] args)
        {
            string zipPath = "C:/test/data.zip";

            // Ein Stream öffnen um eine File Zip zu lesen.
            using (FileStream zipStream = new FileStream(zipPath, FileMode.Open))
            {
                // Das Objekt ZipArchive erstellen.
                using (ZipArchive archive = new ZipArchive(zipStream, ZipArchiveMode.Update))
                {
                    // Ein Entry in ZipArchive einfügen.
                    ZipArchiveEntry readmeEntry = archive.CreateEntry("note/Note.txt");

                    // Ein Stream erstellen um die Inhalt in Entry zu schreiben
                    using (StreamWriter writer = new StreamWriter(readmeEntry.Open()))
                    {
                        writer.WriteLine("## Note.txt");
                        writer.WriteLine("========================");
                    }
                }
            }
        }
    } 
}
Das Beispiel durchführen und das Ergebnis erhalten

4. Der Anhang: den Fehler überwinden

Wenn Sie einen Fehler bekommen: "The name 'ZipFile' does not exist in the current context" (obwohl using System.IO.Compression erklärt) d.h Sie benutzten die ältere als 4.5 Version von .NET oder das Programm findet keine notwendigen DLL Bibliothek
Drücken Sie die Rechtmaustaste auf Projekt, wählen Sie Properties. Und stellen Sie sicher, dass Ihr Projekt die .NET Framework ab der Version von 4.5 benutzt
Starten Sie Ihre Klasse wieder um zu sehen, ob der Compiler dieser Fehler meldet oder nicht. Wenn ja, sollen Sie die Position der DLL Bibliothek bestimmen
  • C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5\System.IO.Compression.FileSystem.dll
  • C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.1\System.IO.Compression.FileSystem.dll
Klicken Sie die Rechtsmaustaste auf Projekt und wählen:
  • Add/Reference..
Wählen Sie die File:
  • System.IO.Compression.FileSystem.dll
So ähnlich wie wenn Sie die Nachricht "The name 'ZipArchive' does not exist in the current context" (trotz der Anmeldung using System.IO.Compression) bekommen, sollen Sie die Bibliothek System.IO.Compression.dll:anmelden
So ähnlich wie wenn Sie die Nachricht "The name 'Path' does not exist in the current context" (trozt der Anmeldung using System.IO) erhalten, sollen Sie die Benutzung der Bibliothek mscorlib.dll:anmelden