Die ZIP-Komprimierung gibt es in der .NET-Basisklassenbibliothek seit dem klassischen .NET Framework 4.5 und im modernen .NET seit Version .NET Core 1.0.
Dr. Holger Schwichtenberg ist technischer Leiter des Expertennetzwerks www.IT-Visions.de, das mit 53 renommierten Experten zahlreiche mittlere und große Unternehmen durch Beratungen und Schulungen sowie bei der Softwareentwicklung unterstützt. Durch seine Auftritte auf zahlreichen nationalen und internationalen Fachkonferenzen sowie mehr als 90 Fachbücher und mehr als 1500 Fachartikel gehört Holger Schwichtenberg zu den bekanntesten Experten für .NET und Webtechniken in Deutschland.
Seit .NET 10.0 Preview 4 gibt es nun in den Klassen System.IO.Compression.ZipFile, System.IO.Compression.ZipArchive und System.IO.Compression.ZipEntry asynchrone Pendants zu bestehenden synchronen Methoden. Zu den neuen Funktionen gehören unter anderem ExtractToDirectoryAsync(), ExtractToFileAsync(), CreateFromDirectoryAsync(), OpenAsync(), OpenReadAsync(), CreateAsync() und CreateEntryFromFileAsync().
Folgender Code zeigt mehrere Beispiele für asynchrone ZIP-Operationen:
class FCL10_Zip { private const string ArchiveFileName = @"t:\CTempArchive.zip"; private const string SourceDirectoryName = @"c:\temp"; private const string DestinationDirectoryName = @"t:\CTempArchiveExtract"; private const string TempFileName = @"t:\tempfile.pdf"; public async Task Run() { CUI.Demo(nameof(FCL10_Zip)); // Prüfe, ob die Datei existiert if (File.Exists(ArchiveFileName)) File.Delete(ArchiveFileName); #region ZIP-Dateien erstellen und extrahieren // ZIP erstellen await ZipFile.CreateFromDirectoryAsync(SourceDirectoryName, ArchiveFileName, CompressionLevel.SmallestSize, includeBaseDirectory: true, entryNameEncoding: Encoding.UTF8); // Prüfe, ob die Datei existiert if (File.Exists(ArchiveFileName)) CUI.Green("ZIP-Datei erstellt: " + ArchiveFileName); else CUI.Red("ZIP-Datei nicht erstellt: " + ArchiveFileName); // ZIP extrahieren await ZipFile.ExtractToDirectoryAsync(ArchiveFileName, DestinationDirectoryName, overwriteFiles: true); // Prüfe, ob das Verzeichnis existiert if (Directory.Exists(DestinationDirectoryName)) CUI.Green("Verzeichnis extrahiert: " + DestinationDirectoryName); else CUI.Red("Verzeichnis nicht extrahiert: " + DestinationDirectoryName); #endregion #region Lesen und Schreiben von Einträgen in eine ZIP-Datei using (var archiveStream = new FileStream(ArchiveFileName, FileMode.OpenOrCreate, FileAccess.ReadWrite)) { await using (ZipArchive a = await ZipArchive.CreateAsync(archiveStream, ZipArchiveMode.Update, leaveOpen: false, entryNameEncoding: Encoding.UTF8)) { // Suche die erste PDF-Datei in a.Entries var pdfFileEntry = a.Entries.Where(x => x.Name.EndsWith(".pdf")).FirstOrDefault(); if (pdfFileEntry != null) { await pdfFileEntry.ExtractToFileAsync(destinationFileName: TempFileName, overwrite: true); await using Stream entryStream = await pdfFileEntry.OpenAsync(); ZipArchiveEntry createdEntry = await a.CreateEntryFromFileAsync(sourceFileName: TempFileName, entryName: "Doppelt_" + pdfFileEntry.Name); CUI.Green("Erste PDF-Datei wurde verdoppelt: " + pdfFileEntry.Name); } } } #endregion } }(rme)











English (US) ·