KNOWLEDGEBASE
Komprimieren oder Entpacken von Dateien mit C# – Komprimierung und Dekomprimierung von Dateien
Was ist ZIP (Dateiformat)
ZIP ist ein Archivdateiformat, das die verlustfreie Datenkomprimierung unterstützt. Eine ZIP-Datei kann eine oder mehrere komprimierte Dateien oder Verzeichnisse enthalten. ZIP-Dateien verwenden in der Regel die Dateierweiterungen .zip oder .ZIP und den MIME-Medientyp application/zip. ZIP wird von vielen Programmen als Basisdateiformat verwendet, normalerweise unter einem anderen Namen. Beim Navigieren in einem Dateisystem über eine Benutzerschnittstelle erscheinen grafische Symbole, die ZIP-Dateien darstellen, häufig als Dokument oder anderes Objekt, das deutlich sichtbar einen Reißverschluss aufweist. Es gibt [mehrere Möglichkeiten, Dateien zu komprimieren] ( https://www.wikihow.com/Unzip-a-File), je nachdem, welches Betriebssystem Sie verwenden. Und fast jeden Tag sollen wir einige Dateien komprimieren oder entpacken und sie an einen Speicherserver oder eine File-Sharing-Plattform weiterleiten. Glücklicherweise können wir diesen Prozess mit Aspose.ZIP API automatisieren. Damit können Sie Dateien komprimieren und dekomprimieren, ohne sich Gedanken über die zugrunde liegende Dateistruktur machen zu müssen. Dieser Artikel zeigt das Arbeiten mit der Komprimierung von Einzel- und Mehrfachdateien. Das Aspose.ZIP-Paket kann mit dem folgenden NuGet-Befehl zu Ihrem .NET-Projekt hinzugefügt werden:
PM> Installationspaket Aspose.Zip
So komprimieren Sie eine einzelne Datei mit C#
- Zuerst müssen wir ein Objekt der FileStream-Klasse für das Ausgabe-ZIP-Archiv erstellen
- Laden Sie eine einzelne Datei in das Objekt FileStream.
- Erstellen Sie ein Objekt der [Archivklasse] ( https://reference.aspose.com/zip/net/aspose.zip/archive/)
- Fügen Sie die Datei mit der Methode Archive.CreateEntry( “FileName”, FileStream) zum Archiv hinzu.
- Erstellen 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 mehr Dateien in den FileStream laden und alle mit der Methode Archive.CreateEntry(“FileName”, FileStream) zum ZIP-Archiv hinzufügen müssen. Das folgende Code-Snippet zeigt, wie Sie mit FileStream mehrere Dateien in die ZIP-Datei einfügen.
// 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 später wie bisher dem ZIP-Archiv hinzugefügt werden. Die FileInfo-Klasse stellt Eigenschaften und Instanzmethoden zum Erstellen, Kopieren, Löschen, Verschieben und Öffnen von Dateien bereit und hilft bei der 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 Komprimierung in Archiven 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#
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 encodingSettings wird verwendet, um ein passwortgeschütztes ZIP-Archiv zu erstellen.
So entpacken Sie Dateien mit Passwort in C#
using (var archive = new Archive("input_archive.zip", new ArchiveLoadOptions{DecryptionPassword = "pass"}))
{
archive.ExtractToDirectory("\\outputDirectory");
}
Der Eigenschaftswert ArchiveLoadOptions with DecryptionPassword wird verwendet, um ein kennwortgeschütztes ZIP-Archiv zu öffnen. Vollständige Beispiele und Datendateien finden Sie unter https://github.com/aspose-zip/Aspose.ZIP-for-.NET.
Verwendung der LZMA-Komprimierung innerhalb des ZIP-Archivs
Der Lempel-Ziv-Markov-Kettenalgorithmus (LZMA) ist ein Algorithmus, der zur Durchführung einer verlustfreien Datenkomprimierung verwendet wird. LZMA verwendet einen Wörterbuchkomprimierungsalgorithmus, der komprimierte Strom ist ein Strom von Bits. Durch die LZMA-Komprimierung innerhalb des ZIP-Archivs können ZIP-Container LZMA-komprimierte Einträge enthalten. Das folgende Codebeispiel zeigt die Implementierung der LZMA-Komprimierung mit 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-Komprimierung im ZIP-Archiv verwenden
bzip2 ist ein kostenloses Open-Source-Dateikomprimierungsprogramm, das den Burrows-Wheeler-Algorithmus verwendet. Es komprimiert nur einzelne Dateien und ist kein Dateiarchivierer. Es wurde von Julian Seward entwickelt und von Mark Wielaard und Micah Snyder gepflegt. Das folgende Code-Snippet zeigt die Implementierung der BZip2-Komprimierung mit 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);
}
}
Verwenden der PPMd-Komprimierung innerhalb des ZIP-Archivs
Prediction by Partial Matching (PPM) ist eine adaptive statistische Datenkomprimierungstechnik, die auf Kontextmodellierung und -vorhersage basiert. PPM-Modelle verwenden einen Satz vorheriger Symbole im unkomprimierten Symbolstrom, um das nächste Symbol im Strom vorherzusagen. PPM-Algorithmen können auch verwendet werden, um Daten in vorhergesagten Gruppierungen in der Clusteranalyse zu gruppieren. Das folgende Code-Snippet zeigt die Implementierung der PPMd-Komprimierung mit 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);
}
}
Archiv mit Einzeldatei 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");
}
}
Decompress Archive with Multiple Files
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");
}
}
Gespeichertes Archiv ohne Komprimierung extrahieren
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.
}
}
}
}
Vollständige Beispiele und Datendateien finden Sie unter https://github.com/aspose-zip/Aspose.ZIP-for-.NET