解压缩.NET中的gzip存档的问题

时间:2009-03-20 05:22:24

标签: c# .net compression gzip

我在互联网上的某个地方抓了下面的代码,我用它来解压缩gzip文件,比如http://wwwmaster.postgresql.org/download/mirrors-ftp/pgadmin3/release/v1.8.4/src/pgadmin3-1.8.4.tar.gz,但是当我运行它时,我得到一个异常,说明这个神奇的数字没有匹配。

public byte[] Download(string pUrl) {
    WebClient wc = new WebClient();
    byte[] bytes = wc.DownloadData(pUrl);
    return UnGzip(bytes, 0);
}

private static byte[] UnGzip(byte[] data, int start) {
    int size = BitConverter.ToInt32(data, data.Length - 4);
    byte[] uncompressedData = new byte[size];
    MemoryStream memStream = new MemoryStream(data, start, (data.Length - start));
    memStream.Position = 0;
    GZipStream gzStream = new GZipStream(memStream, CompressionMode.Decompress);

    try {
        gzStream.Read(uncompressedData, 0, size);
    } catch (Exception gzError) {
        throw;
    }

    gzStream.Close();
    return uncompressedData;
}

导致此问题的代码有什么问题?

4 个答案:

答案 0 :(得分:3)

问题是您在问题中指定的URL实际上并不提供gzip文件。它将浏览器带到您选择镜像的页面。

如果您暂时更改要使用的Download方法:

string text = wc.DownloadString(pUrl);
Console.WriteLine(text);

你会看到镜像选择的所有HTML。

如果您使用的网址是实际 gz文件,例如http://wwwmaster.postgresql.org/redir/170/h/pgadmin3/release/v1.8.4/src/pgadmin3-1.8.4.tar.gz然后就可以了。

答案 1 :(得分:1)

我无法让GZipStream读取您链接的文件,但似乎解压缩其他GZip文件就好了。例如:

ftp://gnu.mirror.iweb.com/gnu/bash/bash-1.14.0-1.14.1.diff.gz

ftp://gnu.mirror.iweb.com/gnu/emacs/elisp-manual-21-2.8.tar.gz

您链接的文件可能已损坏?或者它可能使用非标准或新的GZip格式。

答案 2 :(得分:0)

我使用DotNetZip在.zip文件方面取得了一些成功。根据文档,它也适用于GZip。你可以尝试一下这个人的图书馆。

答案 3 :(得分:-1)

.NET不支持tar格式。 gzip只是一个字节压缩器。 Tar是容器格式。

ZIPRAR等格式,为您结合了这两个步骤,但它们不适合流式压缩。

如果我没记错的话,SharpZipLib支持tar。