Pregunta

Me agarró el siguiente código en algún lugar fuera de Internet, y lo estoy usando para descomprimir los archivos gzip, como http://wwwmaster.postgresql.org/download/mirrors-ftp/pgadmin3/release/v1.8.4/src/pgadmin3 -1.8.4.tar.gz , pero cuando lo ejecuto, me sale una excepción, que indica que el número mágico no coincide.

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

¿Qué pasa con el código que podría causar este problema?

¿Fue útil?

Solución

El problema es que la URL que ha especificado en su pregunta en realidad no dan un archivo gzip. Se necesita el navegador a una página donde se selecciona un espejo.

Si cambia temporalmente su método Download de usar:

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

verá todo el HTML para la selección espejo.

Si utiliza una dirección URL que es el real archivo gz, por ejemplo, http: //wwwmaster.postgresql.org/redir/170/h/pgadmin3/release/v1.8.4/src/pgadmin3-1.8.4.tar.gz entonces funciona bien.

Otros consejos

No pude conseguir el GZipStream para leer el archivo se ha vinculado, pero parece que para descomprimir otros archivos GZip bien. Por ejemplo:

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

Tal vez el archivo se enlazó es corrupto? O tal vez utiliza un formato gzip no estándar o nuevo.

He usado DotNetZip con cierto éxito con los archivos .zip. De acuerdo con la documentación que también funciona con gzip. Es posible dar a la biblioteca de este tipo intentarlo.

.NET no admite la href="http://en.wikipedia.org/wiki/Tar_%28file_format%29" rel="nofollow noreferrer"> alquitrán formato . gzip es simplemente un compresor de bytes. El alquitrán es el formato contenedor.

formatos como postal y RAR , combina estos dos pasos para usted, pero no son buenos para la transmisión de la compresión.

Si no recuerdo mal, SharpZipLib tiene soporte para el alquitrán.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top