Kompression und Dekompression in C#
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
Anleitungen C#
- Vererbung und Polymorphismus in C#
- Was ist erforderlich, um mit C# zu beginnen?
- Schnelles Lernen C# für Anfänger
- Installieren Sie Visual Studio 2013 unter Windows
- Abstrakte Klasse und Schnittstelle in C#
- Installieren Sie Visual Studio 2015 unter Windows
- Kompression und Dekompression in C#
- Die Anleitung zu C# Multithreading Programmierung
- Die Anleitung zu C# Delegate und Event
- Installieren Sie AnkhSVN unter Windows
- C# Programmierung für Team mit Visual Studio und SVN
- Installieren Sie .Net Framework
- Zugriffsmodifikator (Access Modifier) in C#
- Die Anleitung zu C# String und StringBuilder
- Die Anleitung zu C# Property
- Die Anleitung zu C# Enum
- Die Anleitung zu C# Structure
- Die Anleitung zu C# Generics
- Ausnahmen und Ausnahmebehandlung in C#
- Die Anleitung zu C# Date Time
- Manipulieren von Dateien und Verzeichnissen in C#
- Die Anleitung zu C# Stream - binäre Ströme in C#
- Die Anleitung zu C# Reguläre Ausdrücke
- Stellen Sie in C# eine Verbindung zur SQL Server-Datenbank her
- Arbeiten Sie mit der SQL Server-Datenbank in C#
- Stellen Sie in C# eine Verbindung zur MySQL-Datenbank her
- Arbeiten Sie mit der MySQL-Datenbank in C#
- Stellen Sie ohne Oracle Client eine Verbindung zur Oracle-Datenbank in C# her
- Arbeiten Sie mit der Oracle-Datenbank in C#
Show More