如何使用 C# 解压缩 tar.z

How to unzip tar.z using C#

我试过DotNetZip、SharpZipLib甚至用cmd命令rar.exe

但它不起作用

代码是我参考ICSharpCode.SharpZipLib.GZip、ICSharpCode.SharpZipLib.Tar做的

 FileInfo tarFileInfo = new FileInfo(@"D:\*.tar.Z");
        using (Stream sourceStream = new GZipInputStream(tarFileInfo.OpenRead()))
        {
            using (TarArchive tarArchive = TarArchive.CreateInputTarArchive(sourceStream, TarBuffer.DefaultBlockFactor))
            {
                tarArchive.ExtractContents(targetDirectory.FullName);
            }
        }

我会得到这样的错误信息:

ICSharpCode.SharpZipLib.GZip.GZipException: 'Error GZIP header, second magic byte doesn't match

那么如何修复它并成功解压?

.z 使用 LZW,这是一种与 .zip.gz 文件中使用的算法完全不同的算法。 SharpZipLib 通过 ICSharpCode.SharpZipLib.Lzw 命名空间支持 LZW。用于每个算法的命名空间显示在存储库的登录页面的 Namespace Layout 部分。

您可以检查 the LZW unit test file,尽管代码与用于其他格式的代码基本相同,例如:

using (var inStream = new LzwInputStream(File.OpenRead(@"D:\*.tar.Z")))
{
    using (TarArchive tarArchive = TarArchive.CreateInputTarArchive(inStream, TarBuffer.DefaultBlockFactor))
    {
        tarArchive.ExtractContents(targetDirectory.FullName);
    }
}

根据Wikipedia,压缩文件可能使用 DEFLATE 而不是 LZW。在这种情况下,您必须使用 InflaterInputStream 而不是 LzwInputStream.

SharpZipLib 的 repo 中的 TAR sample 使用基于开关的 InflaterInputStream、GZipInputStream 或 BZip2InputStream