SharpZipLib icon indicating copy to clipboard operation
SharpZipLib copied to clipboard

GZipException: 'Error GZIP header, first magic byte doesn't match'

Open ulrichsch opened this issue 4 years ago • 0 comments

Steps to reproduce

  1. Creating tgz and extracting it via the following sample code
using System;
using System.IO;
using ICSharpCode.SharpZipLib.GZip;
using ICSharpCode.SharpZipLib.Tar;

namespace ConsoleApp1
{
  class Program
  {
    static void Main(string[] args)
    {
      CreateTestFiles();
      CreateTarGZ("files.tgz", @".\TestData");
      CreateExtractDir();
      ExtractTGZ("files.tgz", @".\Extract");
    }

    private static void CreateTestFiles()
    {
      Directory.CreateDirectory(@"TestData\0");
      File.WriteAllText(@"TestData\root.txt","root");
      File.WriteAllText(@"TestData\0\sub.txt","sub");
    }

    private static void CreateExtractDir()
    {
      Directory.CreateDirectory(@"Extract");
    }

    private static void ExtractTGZ(String gzArchiveName, String destFolder)
    {
      Stream inStream = File.OpenRead(gzArchiveName);
      Stream gzipStream = new GZipInputStream(inStream);

      var tarArchive = TarArchive.CreateInputTarArchive(gzipStream);
      tarArchive.ExtractContents(destFolder);
      tarArchive.Close();

      gzipStream.Close();
      inStream.Close();
    }

    private static void CreateTarGZ(string tgzFilename, string sourceDirectory)
    {
      Stream outStream = File.Create(tgzFilename);
      Stream gzoStream = new GZipOutputStream(outStream);
      var tarArchive = TarArchive.CreateOutputTarArchive(gzoStream);

      tarArchive.RootPath = sourceDirectory.Replace('\\', '/');
      if (tarArchive.RootPath.EndsWith("/"))
        tarArchive.RootPath = tarArchive.RootPath.Remove(tarArchive.RootPath.Length - 1);

      AddDirectoryFilesToTar(tarArchive, sourceDirectory, true);

      tarArchive.Close();
    }

    private static void AddDirectoryFilesToTar(TarArchive tarArchive, string sourceDirectory, bool recurse)
    {
      var tarEntry = TarEntry.CreateEntryFromFile(sourceDirectory);
      tarArchive.WriteEntry(tarEntry, false);

      var filenames = Directory.GetFiles(sourceDirectory);
      foreach (var filename in filenames)
      {
        tarEntry = TarEntry.CreateEntryFromFile(filename);
        tarArchive.WriteEntry(tarEntry, true);
      }

      if (recurse)
      {
        var directories = Directory.GetDirectories(sourceDirectory);
        foreach (var directory in directories)
          AddDirectoryFilesToTar(tarArchive, directory, recurse);
      }
    }
  }
}

Expected behavior

  • The created tgz shall be extracted without an exception. With version 0.86.0.518 this once was working.

Actual behavior

  • GZipException: 'Error GZIP header, first magic byte doesn't match' within tarArchive.ExtractContents()

Version of SharpZipLib

  • 1.2.0.246

Obtained from (only keep the relevant lines)

  • Package installed using NuGet

ulrichsch avatar Nov 24 '21 14:11 ulrichsch