Entwicklung & Code

Neu in .NET 10.0 [28]: Asynchrone ZIP-Operationen


close notice

This article is also available in
English.

It was translated with technical assistance and editorially reviewed before publication.

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.

Weiterlesen nach der Anzeige




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)



Source link

Beliebt

Die mobile Version verlassen