Question

Je saisis le code suivant quelque part sur l'Internet, et je l'utilise pour décompresser les fichiers gzip, tels que http://wwwmaster.postgresql.org/download/mirrors-ftp/pgadmin3/release/v1.8.4/src/pgadmin3 -1.8.4.tar.gz , mais quand je le lance, je reçois une exception, indiquant que le nombre magique ne correspond pas.

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

Quel est le problème avec le code qui causerait ce problème?

Était-ce utile?

La solution

Le problème est que l'URL que vous avez spécifié dans votre question ne donne pas vraiment un fichier gzip. Il prend le navigateur vers une page où vous sélectionnez un miroir.

Si vous changez temporairement votre méthode à utiliser Download:

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

vous verrez tout le code HTML pour la sélection du miroir.

Si vous utilisez une URL qui est le réelle fichier gz, par exemple http: //wwwmaster.postgresql.org/redir/170/h/pgadmin3/release/v1.8.4/src/pgadmin3-1.8.4.tar.gz il fonctionne très bien.

Autres conseils

Je ne pouvais pas le GZipStream lire le fichier lié, mais il semble décomprimer d'autres fichiers GZip très bien. Par exemple:

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

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

Peut-être le fichier est corrompu lié? Ou peut-être qu'il utilise un format gzip non standard ou nouvelle.

Je l'ai utilisé DotNetZip avec un certain succès avec des fichiers .zip. Selon les documents, il travaille aussi avec GZip. Vous pouvez donner la bibliothèque de ce type d'essayer.

.NET ne prend pas en charge le format goudron . gzip est tout simplement un compresseur d'octets. Le goudron est le format de conteneur.

Formats comme ZIP et RAR , combine ces deux étapes pour vous, mais ils ne sont pas bons pour le streaming de compression.

Si je me souviens bien, SharpZipLib a un support pour le goudron.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top