Neu in .NET 7.0 [21]: Komprimierte Tar-Archive

Das Verarbeiten von Tar-Archiven ist eine Neuerung in .NET 7.0. Um sie zu komprimieren, sind separate Verfahren wie GZip erforderlich.

In Pocket speichern vorlesen Druckansicht

(Bild: rawf8/Shutterstock.com)

Lesezeit: 1 Min.
Von
  • Dr. Holger Schwichtenberg

Der vorherige Teil dieser .NET 7.0-Serien hat Tar-Archive behandelt, die man nun in .NET mit Klassen im Namensraum System.Formats.Tar erzeugen und entpacken kann. Ein Tar-Archiv ist im Standard nicht komprimiert, lässt sich aber mit Komprimierungsverfahren wie GZip kombinieren.

Der Dotnet-Doktor – Holger Schwichtenberg

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.

Folgender Code zeigt, wie man eine komprimierte Tar-Datei aus einzelnen Dateien erstellt:

/// <summary>
/// GZip-komprimiertes Archiv aus dem Inhalt aus einzelnen Dateien erstellen
/// </summary>
public static void TARDemo_Compressed()
 {
  string folder = @"T:\Dokumente";
  string folder2 = @"T:\DokumenteExtrahiert2";
  string tarFile = @"T:\ArchivKomprimiert.tar.gz";

  using (MemoryStream ms = new())
  {
   using (TarWriter writer = new(ms, TarEntryFormat.Pax, leaveOpen: true))
   {
    foreach (var file in new System.IO.DirectoryInfo(folder).GetFiles("*.xlsx"))
    {
     writer.WriteEntry(fileName: file.FullName, entryName: file.Name);
     Console.WriteLine(file.FullName);
    }
   }
   using FileStream tarstream = File.Create(tarFile);
   using GZipStream compressor = new(tarstream, CompressionMode.Compress);
   ms.Seek(0, SeekOrigin.Begin);
   ms.CopyTo(compressor);
   ms.Close();
   compressor.Dispose();
   tarstream.Dispose();
  }

} 

Auch ein komprimiertes Tar-Archiv kann man mit ExtractToDirectory() entpacken:

using FileStream compressedStream = File.OpenRead(@"T:\ArchivKomprimiert.tar.gz");
using GZipStream decompressor = new(compressedStream, CompressionMode.Decompress);
TarFile.ExtractToDirectory(source: decompressor, 
                           destinationDirectoryName: @"t:\DokumenteExtrahiert", 
                           overwriteFiles: true);

Ebenso kann man bestimmte Dateien auch einzeln extrahieren:

/// <summary>
/// Extrahieren nur der XLSX-Dateien aus einem TAR-Archiv
/// </summary>
 public static void TAR_DateienExtrahieren()
 {
  string folder3 = @"T:\DokumenteExtrahiert";
  string tar = @"T:\ArchivKomprimiert.tar.gz";

  using (FileStream fs = File.OpenRead(tar))
  {
   using GZipStream decompressor = new(fs, CompressionMode.Decompress);
   using TarReader reader = new(decompressor, leaveOpen: false);
   TarEntry? entry;
   int count = 0;
   while ((entry = reader.GetNextEntry(copyData: true)) != null)
   {
    if (entry.Name.EndsWith(".xlsx"))
    {
     string destFileName = Path.Join(folder3, entry.Name);
     Console.WriteLine($"Datei {++count}: {destFileName}");
     entry.ExtractToFile(destFileName, overwrite: true);
    }
   }
  }
 }

(rme)