0

我从 Internet 的某个地方抓取了以下代码,并使用它来解压缩 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

4 回答 4

3

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

如果您临时更改Download使用方法:

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

您将看到所有用于镜像选择的 HTML。

如果您使用的 URL 是实际的gz 文件,例如http://wwwmaster.postgresql.org/redir/170/h/pgadmin3/release/v1.8.4/src/pgadmin3-1.8.4.tar.gz那么它工作正常。

于 2009-03-20T06:37:39.820 回答
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 格式。

于 2009-03-20T05:45:45.903 回答
0

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

于 2009-03-20T05:54:26.023 回答
-1

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

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

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

于 2009-03-20T05:47:52.793 回答