Pergunta

Eu agarrei o seguinte em algum lugar do código fora da Internet, e estou usando-o para arquivos gzip descomprimir, como http://wwwmaster.postgresql.org/download/mirrors-ftp/pgadmin3/release/v1.8.4/src/pgadmin3 -1.8.4.tar.gz , mas quando eu executá-lo, eu recebo uma exceção, afirmando que o número mágico não corresponde.

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;
}

O que há de errado com o código que poderia causar este problema?

Foi útil?

Solução

O problema é que a URL que você especificou na sua pergunta não realmente dar um arquivo gzip. Leva o navegador para uma página onde você seleciona um espelho.

Se você alterar temporariamente o seu método Download ao uso:

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

você verá todo o HTML para a seleção espelho.

Se você usar uma URL que é a real arquivo gz, por exemplo, http: //wwwmaster.postgresql.org/redir/170/h/pgadmin3/release/v1.8.4/src/pgadmin3-1.8.4.tar.gz em seguida, ele funciona bem.

Outras dicas

Eu não poderia obter o GZipStream para ler o arquivo é ligada, mas parece para descomprimir outra GZip arquivos muito bem. Por exemplo:

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

Talvez o arquivo que você vinculado é corrupto? Ou talvez ele usa um formato GZip não-padrão ou nova.

Eu usei DotNetZip com algum sucesso com arquivos .zip. De acordo com os docs Ele também funciona com GZip. Você pode dar biblioteca desse cara uma tentativa.

.NET não suporta o href="http://en.wikipedia.org/wiki/Tar_%28file_format%29" rel="nofollow noreferrer"> tar formato . gzip é simplesmente um compressor de byte. Tar é o formato do recipiente.

ZIP e RAR , combina estes dois passos para você, mas eles não são bons para streaming de compressão.

Se bem me lembro, SharpZipLib tem suporte para o alcatrão.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top