Domanda

Ho afferrato il seguente codice da qualche parte da Internet, e lo sto usando per decomprimere i file gzip, come ad esempio http://wwwmaster.postgresql.org/download/mirrors-ftp/pgadmin3/release/v1.8.4/src/pgadmin3 -1.8.4.tar.gz , ma quando l'eseguo, ottengo un'eccezione, affermando che il numero magico non corrisponde.

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

Cosa c'è di sbagliato con il codice che potrebbe causare questo problema?

È stato utile?

Soluzione

Il problema è che l'URL specificato nella tua domanda in realtà non dà un file gzip. Prende il browser a una pagina in cui si seleziona uno specchio.

Se si cambia temporaneamente il metodo di Download da usare:

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

vedrete tutto il codice HTML per la selezione specchio.

Se si utilizza un URL che è il reale file gz, per esempio http: //wwwmaster.postgresql.org/redir/170/h/pgadmin3/release/v1.8.4/src/pgadmin3-1.8.4.tar.gz allora funziona bene.

Altri suggerimenti

non ho potuto ottenere il GZipStream per leggere il file si è collegato, ma sembra per decomprimere altri file gzip bene. Ad esempio:

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

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

Forse il file si è collegato è corrotto? O forse utilizza un formato non standard o nuova gzip.

Ho usato DotNetZip con un certo successo con i file .zip. Secondo la documentazione Funziona anche con gzip. Si potrebbe dare la biblioteca di questo tipo una prova.

.NET non supporta il href="http://en.wikipedia.org/wiki/Tar_%28file_format%29" rel="nofollow noreferrer"> catrame formato . gzip è semplicemente un compressore byte. Tar è il formato contenitore.

ZIP e RAR , combina entrambi questi passaggi per voi, ma non sono un bene per lo streaming di compressione.

Se non ricordo male, SharpZipLib ha il supporto per il catrame.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top