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.
- 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.
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)