Frage

Ich packte den folgenden Code irgendwo aus dem Internet, und ich bin mit ihm gzip-Dateien wie http://wwwmaster.postgresql.org/download/mirrors-ftp/pgadmin3/release/v1.8.4/src/pgadmin3 -1.8.4.tar.gz , aber wenn ich es laufen lasse, erhalte ich eine Ausnahme, die besagt, dass die magische Zahl nicht übereinstimmt.

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

Was ist falsch mit dem Code, der dieses Problem verursachen würde?

War es hilfreich?

Lösung

Das Problem ist, dass die URL, die Sie in Ihrer Frage angegeben nicht wirklich einer gzip-Datei geben. Es nimmt den Browser auf eine Seite, wo Sie einen Spiegel aus.

Wenn Sie vorübergehend Ihre Download Methode ändern zu verwenden:

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

Sie werden alle HTML-Code für Spiegel Auswahl sehen.

Wenn Sie eine URL verwenden, das ist die eigentlichen gz-Datei, zum Beispiel http: //wwwmaster.postgresql.org/redir/170/h/pgadmin3/release/v1.8.4/src/pgadmin3-1.8.4.tar.gz dann funktioniert es gut.

Andere Tipps

Ich kann nicht die GZipStream bekommen Sie die Datei verknüpft zu lesen, aber es scheint, andere GZIP-Dateien zu dekomprimieren gut. Zum Beispiel:

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

Vielleicht ist die Datei, die Sie korrupt verknüpft ist? Oder vielleicht verwendet es ein Nicht-Standard oder neues GZIP-Format.

Ich habe verwendet DotNetZip mit einigem Erfolg mit ZIP-Dateien. Nach dem docs es funktioniert auch mit gzip. Sie könnten diesem Kerl Bibliothek versuchen.

.NET unterstützt nicht das tar Format. gzip ist einfach ein Byte Kompressor. Tar ist das Container-Format.

Formate wie ZIP und RAR , kombiniert diese beiden Schritte für Sie, aber sie sind nicht gut für die Kompression Streaming.

Wenn ich mich richtig erinnere, SharpZipLib hat die Unterstützung für Teer.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top