« (De-)Kompression durchführen
Zwar ist Speicher heutzutage üblicherweise keine Mangelware mehr, dennoch kann sich die Komprimierung großer Datenmengen, beispielsweise zur Übertragung, lohnen. C# bietet dazu einige Möglichkeiten, so unter anderem zur Arbeit mit ZIP-Archiven. Zu diesen möchte ich jedoch in einem separaten Beitrag kommen und stattdessen zeigen, wie sich mit der DeflateStream
-Klasse beliebige Daten(-ströme) (de-)komprimieren lassen:
// Daten komprimieren
public static byte[] Compress(byte[] data) {
using(MemoryStream inStream = new(data)) {
using(MemoryStream outStream = new()) {
using(DeflateStream deflate = new(outStream, CompressionMode.Compress)) {
inStream.CopyTo(deflate);
}
return outStream.ToArray();
}
}
}
// Daten dekomprimieren
public static byte[] Decompress(byte[] data) {
using(MemoryStream inStream = new MemoryStream(data)) {
using(MemoryStream outStream = new()) {
using(DeflateStream deflate = new(inStream, CompressionMode.Decompress)) {
deflate.CopyTo(outStream);
}
return outStream.ToArray();
}
}
}
Um beispielsweise komplette Dateien effizient zu (de-)komprimieren, kann wie folgt vorgegangen werden:
// Datei komprimieren
public static void CompressFile(string inputPath, string outputPath) {
using(FileStream inStream = File.OpenRead(inputPath)) {
using(FileStream outStream = File.OpenWrite(outputPath)) {
using(DeflateStream deflate = new(outStream, CompressionMode.Compress)) {
inStream.CopyTo(deflate);
}
}
}
}
// Datei dekomprimieren
public static void DecompressFile(string inputPath, string outputPath) {
using(FileStream inStream = File.OpenRead(inputPath)) {
using(FileStream outStream = File.OpenWrite(outputPath)) {
using(DeflateStream deflate = new(inStream, CompressionMode.Decompress)) {
deflate.CopyTo(outStream);
}
}
}
}