using ICSharpCode.SharpZipLib.GZip;
using ICSharpCode.SharpZipLib.Tar;
var directory = $"/tmp/{Guid.NewGuid()}";
Directory.CreateDirectory(directory);
File.WriteAllText($"{directory}/1.txt", "1");
var archiveFilePath = $"/tmp/{Guid.NewGuid()}.tar.gz";
using (var archiveStream = new GZipOutputStream(File.Create(archiveFilePath)))
using (TarArchive tarArchive = TarArchive.CreateOutputTarArchive(archiveStream, Encoding.UTF8))
tarArchive.ProgressMessageEvent += (archive, entry, message) => {
Console.WriteLine($"CREATE: {entry.Name}: {message}");
tarArchive.RootPath = directory;
while (tarArchive.RootPath.StartsWith("/", StringComparison.Ordinal))
tarArchive.RootPath = tarArchive.RootPath.Substring(1);
var entry = TarEntry.CreateEntryFromFile(directory);
tarArchive.WriteEntry(entry, true);
using (var archiveStream = File.OpenRead(archiveFilePath))
using (var gzipStream = new GZipInputStream(archiveStream))
using (var tarArchive = TarArchive.CreateInputTarArchive(gzipStream, Encoding.UTF8))
tarArchive.ProgressMessageEvent += (archive, entry, message) => {
Console.WriteLine($"EXTRACT: {entry.Name}: {message}");
tarArchive.ExtractContents($"/tmp/{Guid.NewGuid()}");
Console.WriteLine("Done");