ZIP ist ein Archivdateiformat, das verlustfreie Datenkompression unterstützt. Eine ZIP‑Datei kann eine oder mehrere Dateien bzw. Verzeichnisse enthalten, die komprimiert wurden. ZIP‑Dateien verwenden in der Regel die Dateierweiterungen .zip oder .ZIP und den MIME‑Typ application/zip. Viele Programme nutzen ZIP als Basisdateiformat, häufig unter einem anderen Namen. In grafischen Benutzeroberflächen wird das Symbol für ZIP‑Dateien oft als Dokument oder ein Objekt mit einem sichtbaren Reißverschluss dargestellt.
Es gibt mehrere Möglichkeiten, Dateien zu zippen (komprimieren)
, abhängig vom verwendeten Betriebssystem. Und fast täglich müssen wir Dateien zippen oder entzippen und sie an einen Speicher‑Server oder eine Dateifreigabe‑Plattform weiterleiten. Zum Glück lässt sich dieser Vorgang mit der Aspose.ZIP API
automatisieren. Sie ermöglicht das Komprimieren und Dekomprimieren von Dateien, ohne sich um die zugrunde liegende Dateistruktur kümmern zu müssen. Dieser Artikel zeigt, wie man sowohl einzelne als auch mehrere Dateien komprimiert.
Aspose.ZIP‑Paket kann Ihrem .NET‑Projekt mit folgendem NuGet‑Befehl hinzugefügt werden:
PM> Install-Package Aspose.Zip
Wie man eine einzelne Datei mit C# komprimiert
- Zuerst müssen wir ein Objekt der FileStream‑Klasse
für das Ausgabe‑ZIP‑Archiv erstellen.
- Laden Sie eine einzelne Datei in das FileStream
‑Objekt.
- Erzeugen Sie ein Objekt der Archive‑Klasse
.
- Fügen Sie die Datei mit der Methode Archive.CreateEntry
(„Dateiname“, FileStream) zum Archiv hinzu.
- Speichern Sie das ZIP‑Archiv mit der Methode Archive.Save
(FileStream).
using (FileStream zipFile = File.Open(dataDir + "CompressSingleFile_out.zip", FileMode.Create))
{
//File to be added to archive
using (FileStream source1 = File.Open(dataDir + "alice29.txt", FileMode.Open, FileAccess.Read))
{
using (var archive = new Archive(new ArchiveEntrySettings()))
{
archive.CreateEntry("alice29.txt", source1);
archive.Save(zipFile);
}
}
}
Mehrere Dateien mit C# komprimieren
Der Unterschied zwischen dem Komprimieren einer einzelnen Datei und mehrerer Dateien besteht darin, dass wir mehrere Dateien in den FileStream laden und sie alle mit der Methode Archive.CreateEntry("Dateiname", FileStream) zum ZIP‑Archiv hinzufügen müssen. Der folgende Code‑Abschnitt zeigt, wie mehrere Dateien mit FileStream hinzugefügt werden.
// Create FileStream for output ZIP archive
using (FileStream zipFile = File.Open("compressed_files.zip", FileMode.Create))
{
// File to be added to archive
using (FileStream source1 = File.Open("alice29.txt", FileMode.Open, FileAccess.Read))
{
// File to be added to archive
using (FileStream source2 = File.Open("asyoulike.txt", FileMode.Open, FileAccess.Read))
{
using (var archive = new Archive())
{
// Add files to the archive
archive.CreateEntry("alice29.txt", source1);
archive.CreateEntry("asyoulik3.txt", source2);
// ZIP the files
archive.Save(zipFile, new ArchiveSaveOptions() { Encoding = Encoding.ASCII, ArchiveComment = "two files are compressed in this archive" });
}
}
}
}
Dateien mit der FileInfo‑Klasse komprimieren
Dateien können auch über die FileInfo‑Klasse geladen und anschließend wie zuvor zum ZIP‑Archiv hinzugefügt werden. Die FileInfo‑Klasse stellt Eigenschaften und Instanzmethoden für das Erstellen, Kopieren, Löschen, Verschieben und Öffnen von Dateien bereit und erleichtert die Erstellung von FileStream‑Objekten.
using (FileStream zipFile = File.Open("compressed_files.zip", FileMode.Create))
{
// Files to be added to archive
FileInfo fi1 = new FileInfo("alice29.txt");
FileInfo fi2 = new FileInfo("fields.c");
using (var archive = new Archive())
{
// Add files to the archive
archive.CreateEntry("alice29.txt", fi1);
archive.CreateEntry("fields.c", fi2);
// Create ZIP archive
archive.Save(zipFile, new ArchiveSaveOptions() { Encoding = Encoding.ASCII });
}
}
Dateien ohne Kompression im Archiv speichern
//Creates zip archive without compressing files
using (FileStream zipFile = File.Open(dataDir + "StoreMultipleFilesWithoutCompression_out.zip", FileMode.Create))
{
FileInfo fi1 = new FileInfo(dataDir + "alice29.txt");
FileInfo fi2 = new FileInfo(dataDir + "lcet10.txt");
using (Archive archive = new Archive(new ArchiveEntrySettings(new StoreCompressionSettings())))
{
archive.CreateEntry("alice29.txt", fi1);
archive.CreateEntry("lcet10.txt", fi2);
archive.Save(zipFile, new ArchiveSaveOptions() { Encoding = Encoding.ASCII });
}
}
ZIP‑Dateien mit Passwort in C# erstellen
using (var archive = new Archive(new ArchiveEntrySettings(encryptionSettings: new TraditionalEncryptionSettings("pass"))))
{
archive.CreateEntry("entry_name1.dat", "input_file1.dat");
archive.CreateEntry("entry_name2.dat", "input_file2.dat");
archive.Save("result_archive.zip");
}
Der Parameter encryptionSettings wird verwendet, um ein passwortgeschütztes ZIP‑Archiv zu erzeugen.
ZIP‑Dateien mit Passwort in C# entpacken
using (var archive = new Archive("input_archive.zip", new ArchiveLoadOptions{DecryptionPassword = "pass"}))
{
archive.ExtractToDirectory("\\outputDirectory");
}
Die ArchiveLoadOptions mit dem Property DecryptionPassword werden genutzt, um ein passwortgeschütztes ZIP‑Archiv zu öffnen.
Für vollständige Beispiele und Beispieldateien besuchen Sie bitte https://github.com/aspose-zip/Aspose.ZIP-for-.NET
.
LZMA‑Kompression innerhalb eines ZIP‑Archivs verwenden
Der Lempel–Ziv–Markov‑Ketten‑Algorithmus (LZMA) ist ein Verfahren zur verlustfreien Datenkompression. LZMA nutzt ein Wörterbuch‑Kompressionsverfahren, bei dem der komprimierte Strom aus Bits besteht. LZMA‑Kompression innerhalb eines ZIP‑Archivs ermöglicht es, LZMA‑komprimierte Einträge zu speichern. Das folgende Beispiel demonstriert die Implementierung von LZMA‑Kompression mit der Aspose.ZIP API
.
using (FileStream zipFile = File.Open(dataDir + "LZMACompression_out.zip", FileMode.Create))
{
using (Archive archive = new Archive(new ArchiveEntrySettings(new LzmaCompressionSettings())))
{
archive.CreateEntry("sample.txt", dataDir + "sample.txt");
archive.Save(zipFile);
}
}
BZip2‑Kompression innerhalb eines ZIP‑Archivs verwenden
bzip2 ist ein freies, quelloffenes Kompressionsprogramm, das den Burrows–Wheeler‑Algorithmus nutzt. Es komprimiert nur einzelne Dateien und ist kein Archivierungswerkzeug. Entwickelt wurde es von Julian Seward und wird von Mark Wielaard sowie Micah Snyder gepflegt. Das folgende Code‑Snippet zeigt die Implementierung von BZip2‑Kompression mit der Aspose.ZIP API
.
using (FileStream zipFile = File.Open(dataDir + "Bzip2Compression_out.zip", FileMode.Create))
{
using (Archive archive = new Archive(new ArchiveEntrySettings(new Bzip2CompressionSettings())))
{
archive.CreateEntry("sample.txt", dataDir + "sample.txt");
archive.Save(zipFile);
}
}
PPMd‑Kompression innerhalb eines ZIP‑Archivs verwenden
Prediction by Partial Matching (PPM) ist eine adaptive, statistische Datenkompressionstechnik, die auf Kontext‑Modellierung und Vorhersage basiert. PPM‑Modelle nutzen frühere Symbole im unkomprimierten Strom, um das nächste Symbol vorherzusagen. Das folgende Beispiel demonstriert die Implementierung von PPMd‑Kompression mit der Aspose.ZIP API
.
using (FileStream zipFile = File.Open(dataDir + "PPMdCompression_out.zip", FileMode.Create))
{
using (Archive archive = new Archive(new ArchiveEntrySettings(new PPMdCompressionSettings())))
{
archive.CreateEntry("sample.txt", dataDir + "sample.txt");
archive.Save(zipFile);
}
}
Einzelne Datei aus einem Archiv dekomprimieren
using (FileStream fs = File.OpenRead(dataDir + "CompressSingleFile_out.zip"))
{
using (Archive archive = new Archive(fs))
{
int percentReady = 0;
archive.Entries[0].ExtractionProgressed += (s, e) =>
{
int percent = (int)((100 * e.ProceededBytes) / ((ArchiveEntry)s).UncompressedSize);
if (percent > percentReady)
{
Console.WriteLine(string.Format("{0}% decompressed", percent));
percentReady = percent;
}
};
archive.Entries[0].Extract(dataDir + "alice_extracted_out.txt");
}
}
Mehrere Dateien aus einem Archiv dekomprimieren
using (FileStream zipFile = File.Open(dataDir + "CompressMultipleFiles_out.zip", FileMode.Open))
{
StringBuilder sb = new StringBuilder("Entries are: ");
int percentReady = 0;
using (Archive archive = new Archive(zipFile,
new ArchiveLoadOptions()
{
EntryListed = (s, e) => { sb.AppendFormat("{0}, ", e.Entry.Name); },
EntryExtractionProgressed = (s, e) =>
{
int percent = (int)((100 * e.ProceededBytes) / ((ArchiveEntry)s).UncompressedSize);
if (percent > percentReady)
{
Console.WriteLine(string.Format("{0}% compressed", percent)); percentReady = percent;
}
}
}))
{
Console.WriteLine(sb.ToString(0, sb.Length - 2));
using (var extracted = File.Create(dataDir + "alice_extracted_out.txt"))
{
using (var decompressed = archive.Entries[0].Open())
{
byte[] buffer = new byte[8192];
int bytesRead;
while (0 < (bytesRead = decompressed.Read(buffer, 0, buffer.Length)))
{
extracted.Write(buffer, 0, bytesRead);
}
// Read from decompressed stream to extracting file.
}
}
percentReady = 0;
archive.Entries[1].Extract(dataDir + "asyoulik_extracted_out.txt");
}
}
using (FileStream zipFile = File.Open(dataDir + "StoreMultipleFilesWithoutCompression_out.zip", FileMode.Open))
{
using (Archive archive = new Archive(zipFile))
{
using (var extracted = File.Create(dataDir + "alice_extracted_store_out.txt"))
{
using (var decompressed = archive.Entries[0].Open())
{
byte[] buffer = new byte[8192];
int bytesRead;
while (0 < (bytesRead = decompressed.Read(buffer, 0, buffer.Length)))
{
extracted.Write(buffer, 0, bytesRead);
}
// Read from decompressed stream to extracting file.
}
}
using (var extracted = File.Create(dataDir + "asyoulik_extracted_store_out.txt"))
{
using (var decompressed = archive.Entries[1].Open())
{
byte[] buffer = new byte[8192];
int bytesRead;
while (0 < (bytesRead = decompressed.Read(buffer, 0, buffer.Length)))
{
extracted.Write(buffer, 0, bytesRead);
}
// Read from decompressed stream to extracting file.
}
}
}
}
Für vollständige Beispiele und Beispieldateien besuchen Sie bitte https://github.com/aspose-zip/Aspose.ZIP-for-.NET
.