如何使用 SharpZipLib 提取任何档案?

How do I extract any archives with SharpZipLib?

我正在使用 SharpZipLib 提取档案。我设法提取 .zip 档案:

FastZip fastZip = new FastZip();

fastZip.ExtractZip(file, directory, null);

并提取 .tar.gz:

// Use a 4K buffer. Any larger is a waste.    
byte[] dataBuffer = new byte[4096];

using (Stream fileStream = new FileStream(file, FileMode.Open, FileAccess.Read))
{
    using (GZipInputStream gzipStream = new GZipInputStream(fileStream))
    {
        // Change this to your needs
        string fnOut = Path.Combine(directory, Path.GetFileNameWithoutExtension(file));

        using (FileStream fsOut = File.Create(fnOut))
        {
            StreamUtils.Copy(gzipStream, fsOut, dataBuffer);
        }
    }
}

是否还有一种方法可以在我不需要事先知道存档类型的情况下提取任何类型的存档? (例如 SharpZipLib.ExtractAnyArchive(file, directory)

SharpZipLib 不幸的是,目前无法自动检测存档的格式 file/stream。

您要么必须自己以某种形式实现该功能,要么寻找能够自动检测存档格式的替代库。此类库的一个示例是 SharpCompress,但是,正如您在评论中已经指出的那样,不同的库可能具有不同类型的限制和错误,这些限制和错误可能会影响您的软件的功能。

如果您决定为 SharpZipLib 推出自己的自动检测功能,您可以选择不同的方法,例如

  • 尝试使用 SharpZipLib 支持的每种存档格式的存档 (reader/stream) 类 打开一个(未知)存档,直到找到可以成功打开和处理存档文件的软件。

  • 实施一些格式检测例程,扫描档案 file/stream 以确定特定档案格式的 'magic' 签名字节。如果存档的格式 file/stream 已被识别,select 并使用适当的 SharpZipLib 类 来处理检测到的存档格式。